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

格斯主教

我需要能够获取最后一列中的空格数并将其放入新的第一列中。不幸的是,它是我需要计算的 CONSECUTIVE 空格的数量,名称之间的那些需要从计数中排除。这是我迄今为止所做的;

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 是上面的示例输入

这是 head 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

注意:这些是从您的示例中复制粘贴的长度 - 它们与您想要的输出不一致的事实可能归结为站点的格式化工具

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

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

$ 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)

结果应该是一样的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章