AWKを使用して各列の特定の文字数を計算し、それを新しい列として追加するには?

AWKを使用して各列の特定の文字数を計算し、それを新しい列として追加するには?

Nファイルの2番目の列の文字数を数え、この数を3番目の列に印刷したいと思います。入力ファイルの例(タブ区切り):

sample1 TCTNG
sample2 CCNGGGGGTN
sample3 GGGNNNTC

希望の出力(タブ区切り):

sample1 TCTNG   1
sample2 CCNGGGGGTN  2
sample3 GGGNNNTC    3

次の混乱したバージョンを入手できますが、可能であれば1行のバージョンが必要です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

答え1

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

ベース: 1行あたりのパターン数を印刷するには?

答え2

このgsub()関数は置換が行われた回数を返します。この事実を使用して、2番目のフィールドの文字数を計算し、Nその数値を各行の新しいフィールドとして追加できます。

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

出力は末尾のために発生します(または1使用と同じ)。{ print }{ 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

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

答え3

Raku(以前のPerl_6)の使用

raku -ne 'put ~$/.join("").chars if m:g/N*/;'  

入力例:

sample0 TCTG
sample1 TCTNG
sample2 CCNGGGGGTN
sample3 GGGNNNTC

出力例:

sample0 TCTG    0
sample1 TCTNG   1
sample2 CCNGGGGGTN  2
sample3 GGGNNNTC    3

上記のコードは最初にRaku$_テーマ変数(後ろ)を印刷してから印刷します。関連付けられた一致の数\tは、各行の末尾に新しい列として追加されます。join("")N

https://raku.org

関連情報