Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在解析重复项时合并两个CSV_Linux_Sorting_Csv - Fatal编程技术网

Linux 在解析重复项时合并两个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

我有几个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
          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
中的项将获胜。