Linux 在解析重复项时合并两个CSV
我有几个csv需要合并。我想考虑具有相同的第一列和第二列的条目作为重复。 我知道这个命令是这样的Linux 在解析重复项时合并两个CSV,linux,sorting,csv,Linux,Sorting,Csv,我有几个csv需要合并。我想考虑具有相同的第一列和第二列的条目作为重复。 我知道这个命令是这样的 sort -t"," -u -k 1,1 -k 2,2 file1 file2 此外,我还希望以这样一种方式解析重复项,即每次都选择第二个文件中的条目。怎么做?更改两个文件的顺序并添加-s(@Jim Mischel)将解决您的问题 sort -t"," -u -k 1,1 -k 2,2 -s file2 file1 man sort -u, --unique
sort -t"," -u -k 1,1 -k 2,2 file1 file2
此外,我还希望以这样一种方式解析重复项,即每次都选择第二个文件中的条目。怎么做?更改两个文件的顺序并添加
-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
如果建议将文件顺序反转为
排序
命令不起作用(请参见其他答案),另一种方法是先将文件连接到file2
,然后使用-s
开关对其排序
cat file2 file1 | sort -t"," -u -k 1,1 -k 2,2 -s
-s
强制进行稳定排序,这意味着相同的行将以相同的相对顺序出现。由于sort
的输入在file1
之前有file2
中的所有行,因此输出中的所有重复项都应该来自file2
没有明确说明输入文件将按照命令行上提供的顺序读取,因此我猜实现可能会以相反的顺序或交替行或其他方式读取文件。但是如果您先连接文件,那么就不会有歧义。您面临的问题是什么?您的命令对我来说似乎很好(尽管我相信您可以将
-k1,1-k2,2
分组为-k1,2
)。-u
选项应该为您选择的键提供唯一的行。要对第二个文件进行优先级排序,只需将其放在第一位。您确定要颠倒文件顺序吗?我在任何地方都找不到文档。@ishan3243更改文件顺序不会解决问题。使用awk
可以解决您的问题吗?将-s
选项添加到排序中,除了颠倒输入文件的顺序外,还可以确保当存在重复项时,文件2
中的项将获胜。