Linux cmdを使用して列に基づいてuniq行のみを取得する方法は?

Linux cmdを使用して列に基づいてuniq行のみを取得する方法は?

これは私のデータセットです。

col1,col2,col3
a,b,c
a,d,f
d,u,v
f,g,h
d,u,g
x,t,k

予想出力:

f,g,h
x,t,k

選択基準:

何かが複数回発生すると、col1関連するすべての行が削除されます。

sortuniqLinuxまたは他の方法を使用してこの問題を解決できますか?

ベストアンサー1

これは「バッファされていません」(1) 2段階の方法ですawk(通常のファイルのみ)。

awk -F',' 'NR==FNR{cnt[$1]++;next} FNR>1&&cnt[$1]==1' input.csv input.csv 

これはファイルを2回処理するため、コマンドラインでパラメータとして2回宣言します。

  • このパラメータは-F','フィールド区切り文字をに設定します,
  • 最初のステップでは、NRグローバル行カウンターがFNRファイルごとの行カウンターと等しい場合、列 1 の各値が配列で見つかった頻度を記録しますcnt(その値を「配列索引」として使用)、すぐに処理に移動します.次の行。
  • 2番目のパスでは、最初の列の現在値の発生カウンタが正確に1であるかどうか、ファイルの行番号が1より大きいかどうかを確認します(ヘッダーをスキップする)。これが真の場合のみ、現在の行が印刷されます。これは、現在行を印刷するように指示するルールawkブロックの外側の式構文を利用します。trueawk

(1)私のコメントへの回答バッファリングされていない解決策は、ファイルの一部のデータを一時的にRAMに保存するため、引用符で囲みます。するRAM使用量が付属しています。ただし、ファイルの内容をそのまま保存するわけではありません。またRAM内の他のスクロール保持データ(ここでは実用的な意味では、「バッファリング」を考えます。)

おすすめ記事