2016-08-24 5 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 

アイデアは特定と2番目の列に一致する行だけを抽出することですリスト:

hkl0968175377 
hkl0094508 

次のように私が試した拳のアプローチは、AWKを使用していた: 私はCtrlを押しながらVを押して、verbatinモードでタブを入力しています、

awk -F "  " 'FNR==NR{seen[$1]; next} $2 in seen' patterns original_list > 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 

$ wc -l new_list 
0 new_list 

私は0のラインを持って、私の所望の出力は、次の2行でnew_listという名前のアーカイブになりますこの状況。

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

短い方法ですそれ:

+0

あなたの入力ファイルとコードがあなたが指定した通りであれば、期待どおりの出力が得られます。したがって、ファイルをデバッグするには、スクリプト内のprintステートメントを追加してFS、$ 1を最初のファイルから、2番目のファイルから$ 2をデリミタで印刷します。 'printf" <%s> \ n "、$ 1'。 –

+0

フィールドセパレータが正しいとは思わない。 '-F '+''(2つ以上のスペース)で試してください – karakfa

+0

また、データ(またはスクリプト)がWindows OSシステムを通過した場合は、 '\ r \ n'という行末がある可能性があります。 'dos2unix data1.txt data2.txt .... myScript.sh ....'を実行してそれらを整理します。各ファイルは '\ n'専用のバージョンに置き換えられます。がんばろう。 – shellter

答えて

2

は、あなたが実際にgrepをしたい行を、印刷してそうでなければ、我々は、例えば、ファイル2を処理しています

list

hkl0968175377 
hkl0094508 

full_fileあなたは完全なタブ区切りのファイルであるが含まれてい

grep -f list full_file 

greplistの出現を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列に表示されていると推定します

+1

提供されたデータのために機能しますが、データの他の列に "キー"が表示されているとトリップになることがあります。皆さんお元気で。 – shellter

+0

良い点。ありがとう@シェルター –

+0

ありがとうこれは、私は列の位置に注意する必要はありませんので、これは最高のアプローチだった、私はこの特定のタスクのgrepはawkよりも、サポートのおかげで最高だと思う。 – neo33

2

はこれを試してみてください。それとも、少し楽に読みやすくするために(keysseenを変更):

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

英語では:ファイル1を処理し、配列keysに各行の最初のフィールドをロード

場合。フィールド2の値がkeysに含まれている場合は、特にgrep -f私が正しくあなたの質問を読んでいる場合

関連する問題