FileA有n行,每行用于在unix中过滤FileB中的行

时间:2016-11-23 21:07:37

标签: bash unix

我有两个csv文件

FILEA

ORDER BY CASE WHEN (above case) = '' THEN 1 ELSE 0 END

FILEB

ID
1
2
3

我想要做的是获取FileA中的每个值并比较FileB中的ID是否等于FileA中的ID,如果匹配,则在FiLeB中打印整行并将所有内容保存在FileC中。请注意,FileC中的顺序并不重要

预期结果

FileC

name,ID
a,1
a,2
a,4
ab,1
ac,1
bb,3
bd,2
ad,2 

我目前粗略的想法:

name,ID
a,1
a,2
ab,1
ac,1
bb,3
bd,2
ad,2

但是FileA和FileB都相当大,我不确定在这里使用for循环是否是一个好主意,因为它会耗费大量时间。我们还有其他方法可以解决这个问题吗?谢谢

1 个答案:

答案 0 :(得分:1)

使用awk

awk -F ',' 'NR==FNR { a[$1]=$1; next}; $2 in a {print $0};' FileA FileB

对于匹配字段4,您可以将$ 2更改为$ 4。 使用grep时,您不应使用grep -f FileA FileB,而是

grep -f <(sed 's/.*/,&$/' FileA) FileB

第二个grep确保您将跳过dontwantthis,123456789行。

当您想要添加更多条件(第三个字段,......)时,sed命令很快就会失控。