Как посчитать только последовательные пробелы в последнем столбце и вывести сумму в первый столбец

Мне нужно иметь возможность взять количество пробелов в последнем столбце и поместить его в новый первый столбец. К сожалению, мне нужно посчитать количество ПОСЛЕДУЮЩИХ пробелов, те, которые находятся между именами, должны быть исключены из подсчета. Это то, что я сделал до сих пор:

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

Я не могу понять, как считать только последовательные пробелы, а не те, которые находятся между словами.

1
задан 12 July 2019 в 18:40

2 ответа

Я принимаю то, что Вы хотите сделать, считать количество пробелов, составляющих последнего разделителя полей (пробел между предпоследними и последними столбцами).

Используя 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)

Результатом должно быть то же.

1
ответ дан 7 December 2019 в 13:16

С regex точки зрения я думаю, что Вы искали бы это: \s{2,} - что означает "Пространство, которое равняется двум или больше".

Это не будет считать пробелы промежуточными словами.

Это идет от этого: enter image description here

К этому: enter image description here

1
ответ дан 7 December 2019 в 13:16

Другие вопросы по тегам:

Похожие вопросы: