結果

結果

次のようにタブ区切りのデータセットがあります。

#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

関連情報