중복된 줄이 있는 파일의 예:
# 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
동일한 파일을 두 번 처리할 필요가 없으며 다음 논리를 적용하면 충분합니다.
awk -F, '!a[$1,$2]++' blueprint_param_file.csv
!a[$1,$2]++
- 확실하게 하다비판적인key(첫 번째 필드와 두 번째 필드의 연결)는 배열에서 한 번만 나타나므로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}