一意の最初の列と特定の3番目の列値を持つファイルの行のみを印刷します。

一意の最初の列と特定の3番目の列値を持つファイルの行のみを印刷します。

以下のファイルがあります

1,1230,add
1,1235,remove
2,1240,add
2,1245,remove
3,1250,add
4,1255,remove

最初のフィールドに一意の値を持つ行を印刷したいです。そしてここで3番目のフィールドは次のとおりですadd。この例の予想出力は次のとおりです。

3,1250,add

または最初の列のみ、つまり

3

以下のコマンドは別のレコードを提供しますが、3番目の列が「追加」されていることを確認してから出力を印刷したいと思います。

awk -F ',' 'print $1' filename | uniq -u

ベストアンサー1

この場合、私はデュアルパスアプローチを考えました。

awk -F',' 'NR==FNR{seen[$1]++;next} $3=="add" && seen[$1]==1' file.txt file.txt

これにより、入力ファイルが2回処理されます(したがって、パラメータとして2回宣言されます)。

  • 最初のパスでは、NRグローバル行カウンターはFNRファイルごとの行カウンターと同じで、最初のフィールドのこの特定の値が見つかる頻度のみを計算します。それ以外の場合は、処理(コマンドステートメントnext)をすぐにスキップします。
  • 2番目のパスでは、3番目のフィールドが同じであること、および1番目のフィールドが1add回だけ表示されることを確認します。その場合は、その行を印刷します(両方の条件で評価されるためtrue)。

おすすめ記事