比较两个 .csv 文件并写入第三个文件

比较两个 .csv 文件并写入第三个文件

在我的 Mac 上,我有两个文件:

file1.csv(约4000行)

1234,yxds
4352,fsfk
8765,fdgj
7874,hffe
9038,fjro
8297,fhjs

file2.csv(约50行)

1234,"number","date","OS"
4352,"number","date","OS"
8765,"number","date","OS"
8297,"number","date","OS"

文件 3 应如下所示:

1234,yxds
4352,fsfk
8765,fdgj
8297,fhjs

file2.csv所以我只想要存在于但第 2 列的条目file1.csv

本质上我想写一个file1.csv与不同的脚本相比的脚本file3.csv

到目前为止我尝试过joinawk没有成功。这是我到目前为止所尝试的:

join -t, -12 -o 1.1,2.1,2.2 file1.csv file2.csv > file 3.csv

awk 'NR==FNR{a[$1]=$2;next}{if ($1 in a && a[$1] != $2)print;}' FS="|" file1.csv file2.csv > file3.csv

答案1

用于join排序的文件:

join -o 1.1,1.2 <(sort file1.csv) <(sort file2.csv) > file3.csv
  • -o 1.1,1.2表示输出file1.field1file1.field2

输出:

1234 yxds
4352 fsfk
8297 fhjs
8765 fdgj

答案2

使用所需内容创建 2 个文件 f1 和 f2 并运行以下命令(如果您想包含8297在输出中,它将起作用)

sort -k1 f1 > ff1
sort -k1 f2 > ff2
join ff1 ff2 | cut -d ' ' -f1 > t1.txt
join ff1 ff2 | cut -d ' ' -f2 > t2.txt
paste t1.txt t2.txt > finaloutput.out
rm f1 f2 ff1 ff2

Finaloutput.out 将包含所需的输出

答案3

使用米勒(https://github.com/johnkerl/miller

mlr --nidx join -j 1 --lp 2 -f input_01.csv then unsparsify then cut -f 1,22 input_02.csv

你将会拥有

1234 yxds
4352 fsfk
8765 fdgj
8297 fhjs

答案4

将您的搜索词(file2.csv 的第一列)作为搜索模式文件传输到 grep:

$ awk '{print $1}' file2.csv | grep -f - file1.csv 

1234 yxds
4352 fsfk
8765 fdgj
8297 fhjs

相关内容