我有几个需要合并的csv。我想考虑具有相同的第一列和第二列的条目作为重复。 我知道这个命令就像
sort -t"," -u -k 1,1 -k 2,2 file1 file2
我还希望以这样的方式解决重复项,即每次都选择第二个文件中的条目。这样做的方法是什么?
答案 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没有明确声明输入文件将按照它们在命令行上提供的顺序读取,所以我想实现可能会以相反的顺序读取文件,或者交替的线条,或其他什么。但如果你先连接文件,那就没有歧义了。