linux uniq命令怎样将文件中某一列重复的行删除?
例如文件 number1.txt
中存储了你的电话簿信息,其中第一列是联系人,第二列是手机号码。电话簿中存在一个人有多个手机号码的情况,但你只想让每个人仅保留一个手机号码,将多余的手机号去除。
number1.txt :
Li 13800001115
Li 13800001112
Zhang 13800001118
Wang 13800001112
Zhang 13800001114
Wu 13800001113
这时候可以分三步完成:
第一步,将你要筛选的列放到最后,方便排重
awk '{printf("%s %s\n", $2, $1)}' number1.txt > number2.txt
number2.txt :
13800001115 Li
13800001112 Li
13800001118 Zhang
13800001112 Wang
13800001114 Zhang
13800001113 Wu
第二步,利用 sort
+ uniq
命令去除重复的行
sort -k 2 number2.txt | uniq -f 1 > number3.txt
sort -k 2
是将 number2.txt
根据第二列的值进行排序,列的分隔符默认是空白字符。 在使用 uniq
命令前先需要排序,因为当重复的行并不相邻时,uniq
命令是不起作用的。 uniq -f 1
选项是 比较时跳过前 1 列,这样就能根据第2列的值是否相同去排重了。
number3.txt :
13800001112 Li
13800001112 Wang
13800001113 Wu
13800001114 Zhang
第三步,还原文件格式
awk '{printf("%s %s\n", $2, $1)}' number3.txt > number1.txt
number1.txt :
Li 13800001112
Wang 13800001112
Wu 13800001113
Zhang 13800001114
最终大功造成啦!可能你的文件中每一列使用的分隔符不是默认的空白符,这时候也不用担心,你完全可以用 awk
命令将你的分隔符替换成空白符即可,同样,还原的时候只需要执行逆过程而已。