我的目的是比较 2 个不同 csv 文件的特定列,并从第二个文件中获取第一个文件中没有的数据。例如。
第一个文件
"siddhartha",1
"mukherjee",2
第二个文件
"siddhartha",1
"mukherjee",2
"unique",3
预期产出
"unique",3
当第一列的文本大小受到限制时,以下命令可以正常工作,因此在上面的示例中它可以正常工作。
awk -F',' 'FNR==NR{a[$1];next};!($1 in a);' file1.csv file2.csv > file3.csv
但是第一列的文本大小相当大(例如 10000 个字符),它不起作用。它在某个点剪切文本。
有什么解决办法吗?
答案1
根据上面的简单示例,这应该可行。如果第一列中的任何数据可能最终出现在任何其他列中或者数据中存在任何空格,则它将失败。
使用 bash 和 GNU grep。
grep -v -Ff <(cut -d',' -f 1 file1.csv) file2.csv > file3.csv
解释
-v
倒排匹配-Ff
使用文件作为模式源<(cut -d',' -f 1 file1.csv)
获取第一列数据并将其用作我们的“文件”。
答案2
这是一个不使用 awk 的解决方案,而是磨坊主:
$ mlr --nidx join -u -j 1 --np --ur -f file1.csv file2.csv
"unique",3
描述:
--nidx
因为列是按位置索引的(即没有标题行)-u
连接选项不需要排序输入-j 1
加入左侧和右侧文件的第 1 列--np --ur
不发出成对的行,但在右侧文件上发出不成对的行