Linux命令需求:合并文件按姓氏排序、去重后保存至新文件
问题根源
你用的sort -uk2之所以会误删同姓氏不同名字的条目,是因为-k2指定了以第二列(姓氏)作为排序和去重的依据——sort会把所有姓氏相同的行视为重复项,只保留第一个出现的,完全忽略了名字的差异。
可行解决方案
方案1:先去全量重复,再按姓氏排序
先合并两个文件,用sort -u仅去除完全重复的整行(只有两行内容完全一致才会被去重),再单独按姓氏排序:
cat fileA fileB | sort -u | sort -k2 > fileC
方案2:用awk精准去重+排序
用awk的关联数组实现整行去重,再管道给sort按姓氏排序,逻辑更直观,也减少一次排序的开销:
awk '!seen[$0]++' fileA fileB | sort -k2 > fileC
这里seen[$0]会记录每一行的出现次数,第一次遇到某行时输出,后续重复行直接跳过,完美实现仅删除完全重复条目的需求。
方案3:单次sort完成所有操作
如果你想只用一条sort命令搞定,可以指定多关键字排序:先按姓氏排序,姓氏相同时按名字排序,再用-u仅去除完全重复的整行(此时重复行必然相邻):
sort -k2,2 -k1,1 -u fileA fileB > fileC
-k2,2确保主排序依据是姓氏,-k1,1作为次要排序依据保证同姓氏的条目按名字排序,-u只会移除完全相同的整行,不会影响同姓氏不同名字的条目。
内容的提问来源于stack exchange,提问作者iliasflo
相关产品推荐
相关产品推荐

