我需要能够获取最后一列中的空格数并将其放入新的第一列中。不幸的是,我需要计算的是连续空格的数量,名称之间的空格需要从计数中排除。这是我目前所做的;
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)
结果应该是一样的。