2016-08-24 63 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,然後打印行