我有以下问题,我需要提取由标签分隔的大型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
我想了解任何克服这种情况的建议。
答案 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:,这个简单的方法假定列表中的键只出现在输出的一列中而不会重复在各个栏目中)