通过以下命令我们可以打印文件中的重复行
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
仅当第二遍期间 count 大于 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
对于第二个问题(结果相反),使用 option-u
而不是-d
:
cut -d, -f1,2 file.cvs |sort|uniq -u|grep -Ff - file.cvs
答案3
awk解决方案:
--仅打印 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}}