如何过滤由制表符分隔的csv?

时间:2016-08-24 21:24:09

标签: bash awk

我有以下问题,我需要提取由标签分隔的大型csv的一些行,如下所示:

organe organ     hkl0094508      g67      1       LBNhkl23        AcorFive  sentiment        PENDLEorFON WOOLEN MIL    REWS Managed Services                            LBEAN   1-800-SFFA-CALL                                                                                                   N
organe organ     hkl0968175377   g67      1       GNSFORJL        AcorFive  sentiment        NesorF Labs for JL        .                               .       .                       N
organe organ     hkl099999       g67      1       INorFEL385        AcorFive  sentiment        FRYS    REWS Managed Services                            B2B orFech SuppororF        916-356-1234                                                                                                     N
organe organ     hkl108860       g67      1       INorFEL976        ACorFIVE  sentiment        RYOYO   .       .       .       .       .       .                                       N

我们的想法是仅使用特定列表提取第二列中匹配的行:

hkl0968175377
hkl0094508

我尝试的第一种方法是使用awk,如下所示: 我正在用verbatin模式键入选项卡,按ctrl v,

awk -F "      " 'FNR==NR{seen[$1]; next} $2 in seen' patterns original_list > new_list

但是当我做的时候:

$ wc -l new_list
0 new_list

我有0行,我想要的输出是一个名为new_list的存档,包含以下两行:

organe organ     hkl0968175377   g67      1       GNSFORJL        AcorFive  sentiment        NesorF Labs for JL        .                               .       .                       N
organe organ     hkl0094508      g67      1       LBNhkl23        AcorFive  sentiment        PENDLEorFON WOOLEN MIL    REWS Managed Services                            LBEAN   1-800-SFFA-CALL                                                                                                   N

我想了解任何克服这种情况的建议。

2 个答案:

答案 0 :(得分:2)

试试这个:

awk -F '\t' 'FNR==NR{seen[$1]=1; next} seen[$2]' patterns original_list > new_list

这是更短的方式。或者,为了更容易阅读(将seen更改为keys):

awk -F '\t' 'FNR==NR{keys[$1]=1; next} ($2 in keys) { print $0 }' patterns original_list > new_list

英文:

如果处理文件1,则将每行的第一个字段加载到数组keys中。否则,我们正在处理文件2,因此如果字段2的值包含在keys中,则打印行

答案 1 :(得分:2)

如果我正确地阅读了您的问题,您实际上需要grep,特别是grep -f,例如

grep -f list full_file

list包含

的位置
hkl0968175377
hkl0094508

full_file是完整的制表符分隔文件。 grep会在list中的full_file中搜索匹配项。

<强>输出

$ grep -f list full_file
organe organ     hkl0094508      g67      1       LBNhkl23        AcorFive  sentiment        PENDLEorFON WOOLEN MIL    REWS Managed Services                            LBEAN   1-800-SFFA-CALL                                                                                                   N
organe organ     hkl0968175377   g67      1       GNSFORJL        AcorFive  sentiment        NesorF Labs for JL        .                               .       .                       N

(如果这很重要,你可以sort结果顺序, note:,这个简单的方法假定列表中的键只出现在输出的一列中而不会重复在各个栏目中)