10

次のシェルスクリプトを使用して、あるファイルの内容を別のファイルに検索しています。

#!/bin/ksh
file="/home/nimish/contents.txt"

while read -r line; do
    grep $line /home/nimish/another_file.csv
done < "$file"

スクリプトを実行していますが、CSVファイルの内容が表示されていません。私のcontents.txtファイルには、CSVファイルにも存在する"08915673"またはなどの番号が含まれています。"123223"私がしていることに何か問題がありますか?

4

3 に答える 3

32

grepそれ自体はそうすることができます。フラグを使用するだけ-fです:

grep -f <patterns> <file>

<patterns>各行に 1 つのパターンを含むファイルです。そして<file>、検索したいファイルです。

各行の内容が正規表現のように見えても、強制的grepに各行をパターンと見なすには、フラグを使用する必要があることに注意してください-F, --fixed-strings

grep -F -f <patterns> <file>

あなたが言ったように、ファイルがCSVの場合、次のことができます。

grep -f <(tr ',' '\n' < data.csv) <file>

例として、次の行を含むファイル「a.txt」を考えてみましょう。

alpha
0891234
beta

さて、ファイル「b.txt」には次の行があります。

Alpha
0808080
0891234
bEtA

次のコマンドの出力は次のとおりです。

grep -f "a.txt" "b.txt"
0891234

forここでループする必要はまったくありません。grep自体がこの機能を提供します。


今あなたのファイル名を使用して:

#!/bin/bash
patterns="/home/nimish/contents.txt"
search="/home/nimish/another_file.csv"
grep -f <(tr ',' '\n' < "${patterns}") "${search}"

ファイルにある区切り記号に変更','できます。

于 2013-02-25T03:02:27.480 に答える
2

別の解決策:

  • すべて自分で制御する独自の(たとえば、ahash)を使用awkおよび作成します。hash
  • 置換$0 to $iすると、任意のフィールドに一致させることができます。

awk -F"," '
{  
   if (nowfile==""){ nowfile = FILENAME;  }

   if(FILENAME == nowfile)
   {
     hash[$0]=$0;
   }
   else
   {
       if($0 ~ hash[$0])
       {  
           print $0
       }
   }
} '  xx yy
于 2013-02-25T10:07:51.280 に答える
1

やろうとしていることを実行するためにスクリプトが本当に必要だとは思いません。

1 つのコマンドで十分です。私の場合、CSV ファイルの 11 列目に識別番号が必要でした (セパレータとして「;」を使用)。

grep -f <(awk -F";" '{print $11}' FILE_TO_EXTRACT_PATTERNS_FROM.csv) TARGET_FILE.csv

于 2017-09-08T18:09:31.987 に答える