重複行を含むファイルの例:
# 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}