1

file1.csv の既存の文字列を使用して file2.csv から文字列を grep し、一致する行を result.csv ファイルに書き込もうとしています。次のbashスクリプトがあります。

cat file1.csv | while read line; do
    grep $line ./file2.csv > result.csv
done

しかし、結局、result.csv は常に空です。file2.csv から手動で grep を実行すると、すべて正常に動作します。私は何を間違っていますか?

ファイル1.csv:

15098662745072
15098662745508

file2.csv:

";"0";"15098662745072";"4590";"4590";"
";"0";"15098662745508";"6400";"6400";"
";"0";"15098662745515";"6110";"6110";"
";"0";"15098662745812";"7970";"7970";"

期待される結果 (result.csv):

";"0";"15098662745072";"4590";"4590";"
";"0";"15098662745508";"6400";"6400";"
4

2 に答える 2

4

>ファイルを上書きし続けます。>>それに追加するために使用します。

ループを使用する代わりに、単に-fオプションを使用して、ファイルからパターンgrepを読み取ることができます。grep

grep -f file1.csv file2.csv > result.csv

ループを使用する必要がある場合は、次のアプローチを使用します。

while read line; do
    grep "$line" ./file2.csv
done < file1.csv > result.csv
于 2013-08-22T15:14:52.350 に答える
1

これには、grep ではなく awk を使用する必要があります。

a) デフォルトでは、grep は文字列を検索せず、正規表現を検索します。文字列を検索するには、 or またはの代わりにfgreporgrep -Fまたはを使用する必要があります。awkgrep

b) 実際には、file1.csv の数字が file2.csv の完全な特定のフィールドとして表示される場合にのみ一致させたいと考えています。

awk -F'";"' 'NR==FNR{a[$0];next} $3 in a' file1.csv file2.csv > result.csv
于 2013-08-22T18:21:27.450 に答える