合并两个CSV,同时解决重复

时间:2017-04-19 11:47:08

标签: linux sorting csv

我有几个需要合并的csv。我想考虑具有相同的第一列和第二列的条目作为重复。 我知道这个命令就像

sort -t"," -u -k 1,1 -k 2,2 file1 file2

我还希望以这样的方式解决重复项,即每次都选择第二个文件中的条目。这样做的方法是什么?

2 个答案:

答案 0 :(得分:1)

更改两个文件的顺序并添加-s(@ Jim Mischel给出命中)可以解决您的问题。

sort -t"," -u -k 1,1 -k 2,2 -s file2 file1      

man sort
   -u, --unique
          with -c, check for strict ordering; without -c, output only  the
          first of an equal run

   -s, --stable
          stabilize sort by disabling last-resort comparison

简短回答

awk -F"," '{out[$1$2]=$0} END {for(i in out) {print out[i]}}' file1 file2

有点长的回答

awk 'BEGIN {
               FS=OFS=","; # set ',' as field separator
           }  

           {
             out[$1$2]=$0; # save the value to dict, new value would replace old value.
           } 

      END  { 
             for (i in out) {  # in the end, print all value of the dict
                 print out[i];
             }
           }' file1 file2

答案 1 :(得分:1)

如果将文件顺序反转为sort命令的建议不起作用(请参阅其他答案),另一种方法是首先连接文件file2,然后然后使用-s开关对它们进行排序。

cat file2 file1 | sort -t"," -u -k 1,1 -k 2,2 -s

-s强制进行稳定排序,这意味着相同的行将以相同的相对顺序出现。由于sort的输入包含file2之前file1的所有行,因此输出中的所有重复项都应来自file2

sort man page没有明确声明输入文件将按照它们在命令行上提供的顺序读取,所以我想实现可能会以相反的顺序读取文件,或者交替的线条,或其他什么。但如果你先连接文件,那就没有歧义了。