別のリストの内容のための1つのリストをgrep

別のリストの内容のための1つのリストをgrep

ファイルが2つありますが、そのファイルをgrepしたいと思います。

リスト1

ACY1
RPL3
RPL4

リスト2

1   ABHD14A-ACY1
2   ACY1
3   RPL34
4   RPL21
5   RPL3
6   RPL41

私はこれを試しました

grep -Fwf list1.txt list2.txtそしてこれを得た

1   ABHD14A-ACY1
2   ACY1
5   RPL3

私のlist1にABHD14A-ACY1はありません。 grepでこれを行う方法はありますか?

ありがとう

答え1

この-wオプションはgrep完全な単語と一致します。残念ながらダッシュなABHD14A-ACY1のでマッチします。ACY1パターンファイルにスペースを追加できます。

sed 's/^/ /' file1 | grep -Fwf- file2
2   ACY1
5   RPL3

答え2

この-wスイッチは、単語全体を構成する一致を返します。

ABHD14A-ACY1それが返され、返されない理由RPL41は、ACY1isが最初と2番目の行の終わりにあり、任意の行のRPL4始まりまたは終わりではなく、文字、数字の内容、または下線を引くかです。これについてはmanページに説明されていますgrep

これをテストするために、1最初の行の末尾にaを追加することで、1 ABHD14A-ACY116行目の末尾から1を削除してにすると、6 RPL4出力は次のようになります。

2   ACY1
5   RPL3
6   RPL4

持っている正確なコマンドを使用しない、または直接呼び出さずに最初の行を返す方法はありませんgrepsed最初の行を削除するにはパイプを接続する必要があります。

grep -Fwf list1.txt list2.txt | sed '/ABHD14A/d'

または、一致させたくない内容を含む行のみを印刷し、返されるawk内容にパイプします。grep

grep -Fwf list1.txt list2.txt | awk 'NR>1'

または、最初の行を除外するには、grep -vにパイプします。

grep -Fwf list1.txt list2.txt | grep -v ^1

これを行うには他の方法がありますが、これは最も簡単で、すでに持っているものをパイプで接続できます。

関連情報