awk: フィールド 1 と 2 の重複行を削除 [重複]

awk: フィールド 1 と 2 の重複行を削除 [重複]

重複行を含むファイルの例:

 # more  file.csv

 spark2-env,spark_thrift_cmd_opts,--driver-memory 15g --executor-cores 7
 spark2-thrift-sparkconf,spark.memory.offHeap.enabled,true
 mapred-site,yarn.app.mapreduce.am.command-opts,-Xmx5324m -Dhdp.version=${hdp.version}
 spark2-env,spark_thrift_cmd_opts,--driver-memory 15g --executor-cores 7

フィールド1と2で重複した文字列を持つ行のみを削除するために次のawkを作成しましたが、awkはいくつかの不明瞭な理由でフィールド3の重複文字列を含む行も削除しました。

私のawk構文には何の問題がありますか?

 # awk -F, 'NR==FNR{a[$1,$2]++; next} a[$1,$2]==1'  blueprint_param_file.csv  blueprint_param_file.csv

 spark2-thrift-sparkconf,spark.memory.offHeap.enabled,true
 mapred-site,yarn.app.mapreduce.am.command-opts,-Xmx5324m -Dhdp.version=\${hdp.version}

予想出力:

spark2-env,spark_thrift_cmd_opts,--driver-memory 15g --executor-cores 7
spark2-thrift-sparkconf,spark.memory.offHeap.enabled,true
mapred-site,yarn.app.mapreduce.am.command-opts,-Xmx5324m -    

ベストアンサー1

同じファイルを2回処理する必要はなく、次のロジックを適用すれば十分です。

awk -F, '!a[$1,$2]++' blueprint_param_file.csv
  • !a[$1,$2]++- 確実にする批判的key(最初のフィールドと2番目のフィールドの連結)は配列内で一度だけ表示されるため、a重複項目は除外されます。

出力:

spark2-env,spark_thrift_cmd_opts,--driver-memory 15g --executor-cores 7
spark2-thrift-sparkconf,spark.memory.offHeap.enabled,true
mapred-site,yarn.app.mapreduce.am.command-opts,-Xmx5324m -Dhdp.version=${hdp.version}

おすすめ記事