4

2つのファイルがあります。

file1.txt:  
Afghans  
Africans  
Alaskans  
...  

ここfile2.txtには、Webページ上のwgetからの出力が含まれているため、非常に雑然としていますが、最初のリストの単語の多くが含まれています。

Bashscript:

cat file1.txt | while read LINE; do grep $LINE file2.txt; done

これは期待どおりに機能しませんでした。なぜだろうと思ったので、ループ内に$ LINE変数をエコーアウトし、スリープ1を追加して、何が起こっているのかを確認しました。

cat file1.txt | while read LINE; do echo $LINE; sleep 1; grep $LINE file2.txt; done

ターミナルでの出力は次のようになります。

アフガニスタン
アフリカ人
アラスカ人
アルバニア人
アメリカ人
grep:中国語:そのようなファイルまたはディレクトリ
はありません
アラビア
人アラブ人アラブ
人/東インド人
:そのようなファイルまたはディレクトリはありません
アルゼンチン
人アルメニア人
アジア
アジア人インド人
:そのようなファイルまたはディレクトリはありません
file2.txt:アジアのナルト
。 ..

つまり、最終的に「アジア」という単語が見つかったことがわかります。しかし、なぜそれは言うのですか:

そのようなファイル、又はディレクトリはありません

何か変なことが起こっているのですか、それともここで何かが足りないのですか?

4

5 に答える 5

5

どうですか

grep -f file1.txt file2.txt
于 2011-04-11T21:54:44.573 に答える
3

@OP、まず、dos2unixアドバイスどおりに使用してください。次にawkを使用します

awk 'FNR==NR{a[$1];next}{ for(i=1;i<=NF;i++){ if($i in a) {print $i} } } '  file1 file2_wget

注: ループ内で while ループと grep を使用するのは効率的ではありません。これは、反復ごとgrepに file2 で呼び出す必要があるためです。

@OP、大雑把な説明: FNR と NR の意味については、gawk のマニュアルを参照してください。FNR==NR{a[1];next} file1 の内容を array に取得することを意味しaます。FNR が NR と等しくない場合 (これは、2 番目のファイルを読み取ることを意味します)、ファイル内の各単語が array にあるかどうかを確認しますa。ある場合は、印刷してください。(for ループは、各単語を反復するために使用されます)

于 2011-04-12T00:28:09.260 に答える
2

より多くの引用符を使用し、より少ない使用cat

while IFS= read -r LINE; do 
  grep "$LINE" file2.txt
done < file1.txt
于 2011-04-11T19:25:55.963 に答える
1

引用の問題だけでなく、ダウンロードしたファイルには、CRLF行末が含まれていますreaddos2unix反復する前にfile1.txtを変換するために使用します。

于 2011-04-11T19:36:43.290 に答える
1

awk を使用する方が高速ですが、grep を使用するとより少ない労力でより多くの詳細を生成できます。したがって、dos2unixを発行した後、次のように使用します。

grep -F -i -n -f <file_containing_pattern> <file_containing_data_blob>

すべての一致 + 行番号が表示されます (大文字と小文字は区別されません)。

少なくとも、file_containing_pattern からすべての単語を見つけるにはこれで十分です。

grep -F -f <file_containing_pattern> <file_containing_data_blob>
于 2015-01-28T22:52:39.607 に答える