在我的 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
到目前为止我尝试过join
但awk
没有成功。这是我到目前为止所尝试的:
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.field1
和file1.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