【问题标题】:FileA has n rows, each row is used to filter rows in FileB in unix文件有n行,每行用于在unix中过滤File中的行
【发布时间】:2016-11-24 05:59:24
【问题描述】:

我有两个 csv 文件

文件A

ID
1
2
3

文件B

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

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

预期结果

文件C

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

我目前的粗略想法:

while read line
do
   helper_function line
done < FileA

helper_function(){
awk -F, '$2==line {print $0}' FileB
... need to implement more...
}

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

【问题讨论】:

    标签: bash unix


    【解决方案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 命令很快就会失控。

    【讨论】:

    • 嗨,如果在我的真实文件中,FileB 中的 ID 是第 4 列,我只需要将 $2 更改为 $4 吗?
    • OP 我猜在最终输出文件中也需要标题部分。
    • @Inian 这是真的,但没关系。我可以将头文件合并到这个输出中。但不知何故,代码对我来说不能正常工作......
    猜你喜欢
    • 2014-10-29
    • 1970-01-01
    • 2010-09-26
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多