csv 파일의 필드 1,2에서 중복 행만 인쇄

csv 파일의 필드 1,2에서 중복 행만 인쇄

다음 명령에 따라 파일의 중복된 줄을 인쇄할 수 있습니다.

uniq -d string file.txt

하지만 csv 파일에서 이 작업을 어떻게 수행합니까?

csv 파일의 필드 1,2에서 중복 행만 인쇄해야 합니다. - 필드 3은 제외됩니다.

FS-","

예를 들어:

 spark2-thrift-sparkconf,spark.history.fs.logDirectory,{{spark_history_dir}}
 spark2-thrift-sparkconf,spark.history.fs.logDirectory,true
 spark2-thrift-sparkconf,spark.history.Log.logDirectory,true
 spark2-thrift-sparkconf,spark.history.DF.logDirectory,true

예상 결과:

 spark2-thrift-sparkconf,spark.history.fs.logDirectory,{{spark_history_dir}}
 spark2-thrift-sparkconf,spark.history.fs.logDirectory,true

두번째:

csv 파일에서 중복 행을 제외하는 방법(필드 1,2에서만 중복 행을 제거한다는 의미)

예상 출력:

 spark2-thrift-sparkconf,spark.history.Log.logDirectory,true
 spark2-thrift-sparkconf,spark.history.DF.logDirectory,true

답변1

$ awk -F, 'NR==FNR{a[$1,$2]++; next} a[$1,$2]>1' file.txt file.txt 
spark2-thrift-sparkconf,spark.history.fs.logDirectory,{{spark_history_dir}}
spark2-thrift-sparkconf,spark.history.fs.logDirectory,true

동일한 입력 파일을 두 번 사용하여 두 파일을 처리합니다.

  • NR==FNR{a[$1,$2]++; next}처음 두 필드를 키로 사용하여 발생 횟수를 저장합니다.
  • a[$1,$2]>1두 번째 패스 동안 개수가 1보다 큰 경우에만 인쇄


반대의 경우에는 조건 확인을 변경하십시오.

$ awk -F, 'NR==FNR{a[$1,$2]++; next} a[$1,$2]==1' file.txt file.txt 
spark2-thrift-sparkconf,spark.history.Log.logDirectory,true
spark2-thrift-sparkconf,spark.history.DF.logDirectory,true

답변2

cut처음 두 필드는 uniq제안한 대로 수행하고 grep원본 파일의 행에 대한 결과를 사용합니다.

cut -d, -f1,2 file.cvs |uniq -d|grep -Ff - file.cvs

파일이 아직 정렬되지 않은 경우 다음 전에 정렬해야 합니다 uniq.

cut -d, -f1,2 file.cvs |sort|uniq -d|grep -Ff - file.cvs

두 번째 질문(반대 결과)의 경우 -u대신 option을 사용하십시오 -d.

cut -d, -f1,2 file.cvs |sort|uniq -u|grep -Ff - file.cvs

답변3

해결책:

--csv 파일의 필드 1,2에서 중복 행만 인쇄

awk -F, '$1==f1 && $2==f2{ printf "%s,%s,%s\n%s\n", f1,f2,f3,$0 }
        { f1=$1; f2=$2; f3=$3 }' <(sort -t, -k1,1 -k2,2 file.txt)

산출:

spark2-thrift-sparkconf,spark.history.fs.logDirectory,{{spark_history_dir}}
spark2-thrift-sparkconf,spark.history.fs.logDirectory,true

--csv 파일에서 중복 행 제외(필드 1,2)

awk -F, 'f1 && f2{ if($1!=f1 || $2!=f2) { printf "%s,%s,%s\n", f1,f2,f3 } else next }
        { f1=$1; f2=$2; f3=$3 }' <(sort -t, -k1,1 -k2,2 file.txt)

산출:

spark2-thrift-sparkconf,spark.history.DF.logDirectory,true
spark2-thrift-sparkconf,spark.history.fs.logDirectory,{{spark_history_dir}}

관련 정보