ファイルが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
は、ACY1
isが最初と2番目の行の終わりにあり、任意の行のRPL4
始まりまたは終わりではなく、文字、数字の内容、または下線を引くかです。これについてはman
ページに説明されていますgrep
。
これをテストするために、1
最初の行の末尾にaを追加することで、1 ABHD14A-ACY11
6行目の末尾から1を削除してにすると、6 RPL4
出力は次のようになります。
2 ACY1
5 RPL3
6 RPL4
持っている正確なコマンドを使用しない、または直接呼び出さずに最初の行を返す方法はありませんgrep
。sed
最初の行を削除するにはパイプを接続する必要があります。
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
これを行うには他の方法がありますが、これは最も簡単で、すでに持っているものをパイプで接続できます。