如何使用 AWK 计算每行列中特定字符的数量并添加为新列?

eam*_*m12 2 bash awk

我想计算N文件第二列中的字符数,然后将此计数打印到第三列。输入文件示例(制表符分隔):

sample1 TCTNG
sample2 CCNGGGGGTN
sample3 GGGNNNTC
Run Code Online (Sandbox Code Playgroud)

所需的输出(制表符分隔):

sample1 TCTNG   1
sample2 CCNGGGGGTN  2
sample3 GGGNNNTC    3
Run Code Online (Sandbox Code Playgroud)

我可以得到一个混乱的版本执行以下操作,但我想要一个单行,最好是awk.

> awk -F '\t' '{print $2}' file.txt | awk -FN '{print NF-1}' > NCount.txt
> paste -d '\t' file.txt NCount.txt

sample1 TCTNG   
    1
sample2 CCNGGGGGTN  
    2
sample3 GGGNNNTC
    3
Run Code Online (Sandbox Code Playgroud)

Gou*_*nou 9

awk 'BEGIN{FS=OFS="\t"} {print $0, gsub(/N/,"",$2)}' file
sample1 TCTNG   1
sample2 CCNGGGGGTN  2
sample3 GGGNNNTC    3
Run Code Online (Sandbox Code Playgroud)

基于: 如何打印每行的图案数?


Kus*_*nda 7

gsub()函数返回进行替换的次数。您可以使用这个事实来计算第二个字段中的字符数N,并将该数字添加为每行上的新字段:

$ awk -F '\t' '{ $3 = gsub("N","N",$2) }; 1' file
sample1 TCTNG 1
sample2 CCNGGGGGTN 2
sample3 GGGNNNTC 3
Run Code Online (Sandbox Code Playgroud)

输出是由尾随引起的1(相当于使用{ print }or { print $0 })。

设置特殊变量的值OFS以在输出中使用除默认值(空格)之外的另一个字段分隔符。在这里,我使用输入字段分隔符设置为的任何内容:

$ awk -F '\t' 'BEGIN { OFS=FS } { $3 = gsub("N","N",$2) }; 1' file
sample1 TCTNG   1
sample2 CCNGGGGGTN      2
sample3 GGGNNNTC        3
Run Code Online (Sandbox Code Playgroud)

Perl 中也类似,但使用tr运算符代替gsub()

$ perl -MEnglish -a -F '\t' -e 'BEGIN { $OFS="\t"; $ORS="\n" } print @F, ($F[1] =~ tr/N/N/)' file
sample1 TCTNG   1
sample2 CCNGGGGGTN      2
sample3 GGGNNNTC        3
Run Code Online (Sandbox Code Playgroud)