
同じ列 1 の列 2 の項目数を計算しようとしており、同様に、列 1 の列 2 の最初の項目が発生する回数を計算しようとしています。
たとえば、私の入力TSVファイルは次のようになります。
C1 NC01
NC01
C2 NC01
NC01
NC02
C3 NC01
NC02
NC03
私が望む出力は次のとおりです。
C1 NC01 2 2
NC01
C2 NC01 3 2
NC01
NC02
C3 NC01 3 1
NC02
NC03
コマンドラインを使用してこれをどのように実行できますか?
答え1
使用awk
:
awk '{a[NR]=$0} {if(NF!=1){y=$2;x=$0;b[x]=1;c[x]=1}else{b[x]++;if(y==$1){c[x]++}}} END{for (n in a){z=a[n];print z" "b[z]" "c[z]}}' file
もちろん、最も単純なものではありませんが、あなたが提供したコメントに基づいて私には効果がありました。
説明する:
{a[NR]=$0}
:まず、ファイルの内容全体を名前付き配列にロードしますa
。if(NF!=1)
:行に複数の列(複数の列)がある場合...{y=$2;x=$0;b[x]=1;c[x]=1}
y
:...計算する2番目の列の値に変数を設定し、x
行全体に変数を設定します。これらの変数は、以降の反復で使用されます。これはb
2つの配列のインデックスでもあり、c
カウント値を格納する場所でもあります。else{b[x]++;if(y==$1){c[x]++}}
:行に列が1つしかない場合、b
配列の値は増加します。また、その列がに保存されている基本行の2番目の列と一致する場合は、y
その値を増やします。END{for (n in a){z=a[n];print z" "b[z]" "c[z]}}
:最後に配列を繰り返しa
、その値を印刷します(ファイル内容の簡単なダンプ)。また、b
他の2つの配列との数値を印刷しますc
。
出力は以下を提供します。
C1 NC01 2 2
NC01
C2 NC01 3 2
NC01
NC02
C3 NC01 3 1
NC02
NC03