2016-08-24 64 views
1

我有以下的问题,我需要提取的标签,看起来分离大的CSV的一些线路如下:如何过滤由制表符分隔的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

如果你的输入文件和代码如你所说,那么你会得到你期望的输出。因此,要调试文件,请在脚本中添加打印语句,从第一个文件中打印FS,第一个文件打印$ 1,第二个文件打印带有分隔符的打印文件$ 2,以便您清楚地看到它们是什么,例如。 'printf'<%s> \ n“,$ 1'。 –

+0

我不认为你的字段分隔符是正确的。尝试使用'-F'+''(两个或更多空格) – karakfa

+0

或者如果您的数据(或脚本)已通过Windows操作系统系统,则可能有'\ r \ n'行尾。通过运行'dos2unix data1.txt data2.txt .... myScript.sh ....'清理它们。'每个文件将被替换为'\ n'版本。祝你好运。 – shellter

回答

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结果顺序,如果这是很重要的,注:,这种简单的方法设定在列表中的键只出现在你的输出的一列,并在整个不同的列中不重复)

+1

适用于提供的数据,但如果“密钥”出现在其他数据列中(可能不知道O.P的真实含义是什么; - /),可能会被绊倒。祝你们好运。 – shellter

+0

好点。谢谢@shellter –

+0

感谢这是最好的方法,因为我不需要关心列的位置,我相信对于这个特定的任务,grep比awk好,谢谢你的支持。 – neo33

2

试试这个:

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

这是较短的方式。或者,对于更容易一些可读性(改变seenkeys):

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

在英国:

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