如何仅计算最后一列中的连续空格并将总和打印到第一列

如何仅计算最后一列中的连续空格并将总和打印到第一列

我需要能够获取最后一列中的空格数并将其放入新的第一列中。不幸的是,我需要计算的是连续空格的数量,名称之间的空格需要从计数中排除。这是我目前所做的;

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

我假设您想要做的是计算组成最后一个字段分隔符的空格数(倒数第二列和最后一列之间的空格)。

使用 GNU awk,您可以使用合适的正则表达式 () 根据内容拆分行FPAT,然后检索分隔符:

$ gawk  '{n = patsplit($0,a,"[^ ]+( [^ ]+)*",seps); print length(seps[n-1])}' file
12
15
17
17
18
20

注意:这些长度是从您的示例中复制粘贴的 - 它们与您期望的输出不一致,这可能是由于网站的格式化工具所致

此处,[^ ]+( [^ ]+)*表示一个或多个非空格字符,后面可以跟任意数量的单身的空格分隔的非空格字符序列。此正则表达式确保最后一列(多字)被视为一列。

然后您可以重新替换这些值并重建记录:

$ 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并指定分隔符比为字段指定正则表达式更简单。

split($0,a,"[ ][ ]+",seps)

结果应该是一样的。

答案2

从正则表达式的角度来看,我认为您会寻找这个: \s{2,}——意思是“两个或更多个空格”。

它不会计算单词之间的空格。

事情是这样的: 在此处输入图片描述

对此: 在此处输入图片描述

相关内容