Мне нужно иметь возможность взять количество пробелов в последнем столбце и поместить его в новый первый столбец. К сожалению, мне нужно посчитать количество ПОСЛЕДУЮЩИХ пробелов, те, которые находятся между именами, должны быть исключены из подсчета. Это то, что я сделал до сих пор:
Line=$(head -n 1 Krep.07)
(head -n 1 Krep.07) | tr -cd ' \t' | wc -c > whitespace
sed -i '1d' Krep.07
White_count=$(head -n 1 whitespace)
if (( "$White_count" > 6 )) ; then
echo -e "$White_count\t$Line" >> Krep.07.2
fi
Krep.07 - это пример ввода, как указано выше
Вот вывод главы Krep.07.2
16 17.24137931 8.83 65 0 O 204457 Sphingomonadales
18 17.24137931 8.83 65 4 F 41297 Sphingomonadaceae
20 14.05835544 7.2 53 0 G 13687 Sphingomonas
24 11.14058355 5.71 42 42 S 2219696 Sphingomonas sp. FARSPH
23 0.795755968 0.41 3 0 S 152682 Sphingomonas melonis
26 0.795755968 0.41 3 3 - 621456 Sphingomonas melonis TY
Как видите, он подсчитывает пробелы между словами в последнем столбце. Желаемый результат;
16 17.24137931 8.83 65 0 O 204457 Sphingomonadales
18 17.24137931 8.83 65 4 F 41297 Sphingomonadaceae
20 14.05835544 7.2 53 0 G 13687 Sphingomonas
24 11.14058355 5.71 42 42 S 2219696 Sphingomonas sp. FARSPH
22 0.795755968 0.41 3 0 S 152682 Sphingomonas melonis
24 0.795755968 0.41 3 3 - 621456 Sphingomonas melonis TY
Я не могу понять, как считать только последовательные пробелы, а не те, которые находятся между словами.
Я принимаю то, что Вы хотите сделать, считать количество пробелов, составляющих последнего разделителя полей (пробел между предпоследними и последними столбцами).
Используя GNU awk, можно разделить строки на основе содержания с помощью подходящего регулярного выражения (FPAT
), и получите разделители впоследствии:
$ gawk '{n = patsplit($0,a,"[^ ]+( [^ ]+)*",seps); print length(seps[n-1])}' file
12
15
17
17
18
20
Примечание: это длины, как вставляется копией от Вашего примера - то, что они не соглашаются с Вашим желаемым выводом, может быть до инструментов форматирования сайта
Здесь, [^ ]+( [^ ]+)*
средства один или несколько непробелов, дополнительно сопровождаемых любым количеством одиночного пробела, разделили последовательности непробелов. Этот regex гарантирует, что последний столбец (многословный) рассматривают как один.
Можно затем повторно заменить этими значениями и восстановить запись:
$ gawk '{
n = patsplit($0,a,"[^ ]+( [^ ]+)*",seps);
a[1] = length(seps[n-1]);
out = ""; for(i=1;i<=n;i++) out = sprintf("%s%s%s", out, a[i],seps[i]);
print out
}' file
12 17.24137931 8.83 65 0 O 204457 Sphingomonadales
15 17.24137931 8.83 65 4 F 41297 Sphingomonadaceae
17 14.05835544 7.2 53 0 G 13687 Sphingomonas
17 11.14058355 5.71 42 42 S 2219696 Sphingomonas sp. FARSPH
18 0.795755968 0.41 3 0 S 152682 Sphingomonas melonis
20 0.795755968 0.41 3 3 - 621456 Sphingomonas melonis TY
Можно найти более простым заменить patsplit
split
и укажите regex для разделителей, а не для полей напр.
split($0,a,"[ ][ ]+",seps)
Результатом должно быть то же.
С regex точки зрения я думаю, что Вы искали бы это: \s{2,}
- что означает "Пространство, которое равняется двум или больше".
Это не будет считать пробелы промежуточными словами.