web-dev-qa-db-ja.com

grepを使用して、別のファイルの文字列を含むファイルから行を削除する

次のような単語(1行に1つ)を含むファイルがあります



ネコ

次のようなCSV形式のセカンダリファイルがあります

1、靴、赤
2、アップル、ブラック
3、fog、blue

最初のファイルを検索パターンとしてgrepを使用したいのですが、2番目のファイルの行に最初のファイルのWordが含まれている場合、2番目のファイルの行を完全に削除したいと思います。

Grepがこれを実行する方法でさえあるかどうかはわかりません。

編集:bashスクリプト

4
Jason Yost

これは、grep-fオプションを使用して行うことができます(これは、-fではなく小文字の-Fです)。

% echo -e 'Dog\nFish\nCat\nShoes' > ./file1.txt 
% echo -e '1,shoes,red\n2,Apple,black\n3,fog,blue' > ./file2.csv 

# Grab all lines from the CSV that match a pattern from file1:
% grep -if ./file1.txt ./file2.csv
1,shoes,red

# Grab all lines from the CSV that DON'T match a pattern from file1:
% grep -vif ./file1.txt ./file2.csv
2,Apple,black
3,fog,blue

詳細な説明:

  • grep —自明
  • -v —「入力パターンに一致しない戻り行」を意味します
  • -i —「ユースケースに依存しないマッチング」を意味します(最初のファイルには大文字が含まれ、CSVには含まれていなかったため)
  • -f — '指定されたファイル(file1.txt)の各行をマッチングに使用するパターンとして解釈する'を意味します

必要な結果とファイルの内容によっては、-Fおよび-wオプションを読み取ることもできます。

ファイルをインプレースで編集する必要がある場合は、sed-fオプションを使用して編集できると思いますが、sedは、ファイルの各行をコマンドとしてではなくコマンドとして解釈します。 grepのような単純なパターンが行います。

9
kine