このファイルを読み取るためにawkステートメントを作成しようとしています。
A 1,2,3 *
A 4,5,6 **
B 1
B 4,5 *
次のファイルをビルドします。
A 1,2,3 * 3 1 0.333
A 4,5,6 ** 3 2 0.666
B 1 1 0 0
B 4,5 * 2 1 0.5
この新しいファイルでは、最初の3つの列は元のファイルと同じです。 4番目の列には、列2のカンマ区切り要素の数を含める必要があります。 5番目の列には、列3の文字数を含める必要があります。最後の列には、列4から列5の比率が含まれます(つまり、列5を列4で割った値)。
次のコードを試しています。
awk '{print $1"\t"$2"\t"$3"\t"(NF","$2 -1)"\t"length($3)"\t"(length($3)/(NF","$2-1))}' file1 > file2
しかし、私は次のような結果を得ます。
A 1,2,3 * 3,0 1 0.333333
A 4,5,6 ** 3,3 2 0.666667
B 1 2,0 0 0
B 4,5 * 3,3 1 0.333333
4列で私が何が間違っているのか理解できません。
ベストアンサー1
(NF","$2 -1)
これをフィールド内のコンマで区切られた要素の数を返す関数として考えたいと思いますが、$2
そうではありません。NF
常にフィールド数です。記録。
代わりに、awkのsplit
関数を使用してsplit($2,a,",")
フィールドを$2
配列に分割しa
、要素数を返すことができます。printステートメントで明示的な "\ t"を使用する代わりに、出力フィールド区切り文字をタブに設定してコードを整理することもできます。
awk '{l2=split($2,a,","); OFS="\t"; print $1, $2, $3, l2, length($3), length($3)/l2}' file1