次のようにタブ区切りのデータセットがあります。
#1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 10024 10395 41 K + 2 1 1 12 14 5 0 0 3 1 3 6 2
1 10679 10795 51 P + 2 1 1 15 14 3 0 0 2 1 2 3 1
列7-19に基づく値を格納するために、列($ 20)をもう1つ追加したいと思います。列の数字がゼロでない場合は、1つを追加します。予想出力:
#1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 10024 10395 41 K + 2 1 1 12 14 5 0 0 3 1 3 6 2 11
1 10679 10795 51 P + 2 1 1 15 14 3 0 0 2 1 2 3 1 11
awkを使ってコマンドを書くには?
答え1
7番目のフィールドから繰り返し、このフィールドの値が0であることを確認し、そうでない場合は20番目のフィールドに1を追加します。
awk -F '\t' 'NR==1 {$(NF+1)=NF+1; print; next}; \
{for(i=7; i<NF; i++) if ($i != 0) $20++}; 1' OFS='\t' file.txt
最初のレコード(NR==1
)の場合、追加フィールドヘッダーは最後のフィールドとして追加され、現在は1が追加されますNF
。
答え2
perl -aF'\t' -lpe '$_ .= "\t" . ($. == 1 ? @F+1 : grep $_, @F[6..$#F])' data.set
行の末尾に別のフィールドを追加する必要があるため、.=
現在のレコードに演算子を使用してください$_
。最初のレコードの特別な場合は、@F+1
スカラーコンテキストで現在のフィールド数に1を加えたと解釈される式を追加するだけです。
ヘッダー以外のレコードの場合、式はgrep $_, @F[6..$#F]
7番目の要素を配列の最後の要素@F
(オプションで指定されたタブフィールド区切り文字を使用してレコードから切り取る)まで繰り返すことを意味します-F'\t'
。スカラーコンテキストでは、A条件を返します(場合)$_
7番目からスライスの最後の要素まで、ゼロ以外の要素を表します。
結果
#1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 10024 10395 41 K + 2 1 1 12 14 5 0 0 3 1 3 6 2 11
1 10679 10795 51 P + 2 1 1 15 14 3 0 0 2 1 2 3 1 11