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