列 1 と同様の列 2 の項目数を計算します。

列 1 と同様の列 2 の項目数を計算します。

同じ列 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行全体に変数を設定します。これらの変数は、以降の反復で使用されます。これはb2つの配列のインデックスでもあり、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

おすすめ記事