AWKを使用してデータフレームの行をフィルタリングして、特定のフィールドのXインスタンスを持つアイテムのみを表示する

AWKを使用してデータフレームの行をフィルタリングして、特定のフィールドのXインスタンスを持つアイテムのみを表示する

フィールドの1つ(「ID」)が一意の識別子に対応する大規模なデータフレームがあります。ただし、追加の測定値(「structureA」と「structB」)のバイナリの組み合わせによっては、この値の複数のインスタンスがあります。初期データフレームに4つのインスタンスしかないIDに関連する測定値を表示するために、awkを使用して行をフィルタリングする方法を考案したいと思います。

まず、uniq -cまたはawk配列を使用してインスタンス数を計算してファイルに保存し、新しいファイルを使用してawk配列とFNR = = NRを使用して初期データフレームをフィルタリングする2つの部分でこれを実行しますを想像することができます。しかし、私はawkがカウントを集計してから、条件を満たす一連の行を印刷する方法があるかもしれません(例:項目がX回発生する)。

> Initial table
ID  structureA  structureB
sample_1    1   1
sample_2    1   1
sample_2    2   1
sample_2    1   2
sample_2    2   2
sample_3    1   1
sample_3    2   1
sample_3    3   1
sample_4    1   1
sample_4    2   1
sample_4    3   1
sample_4    4   1

> Desired table
ID  structureA  structureB
sample_2    1   1
sample_2    2   1
sample_2    1   2
sample_2    2   2
sample_4    1   1
sample_4    2   1
sample_4    3   1
sample_4    4   1

ベストアンサー1

awkスクリプトを改良したEd Mortonに感謝します。

awk -v n=$1 '
NR==1
{a[$1]=($1 in a ? a[$1] RS : "") $0}
END{for(i in a){if(gsub(RS,"&",a[i])==n-1){print a[i]}}}
' "$2"

NR==1タイトルを印刷してください。最後のステートメントは、各配列要素の行数を確認するために分割関数を呼び出します。 4つの場合は印刷してください。

./script 4 file実行可能にしたら、次のように呼び出すことができます(最初の引数は反復回数、2番目の引数はファイル名)。

この答えは、同じ最初のフィールドを持つ行が入力ファイル内で互いに隣り合うことを強制しません。

おすすめ記事