別のファイルリストの文字列を含むテキストファイルから行を抽出するには? [コピー]

別のファイルリストの文字列を含むテキストファイルから行を抽出するには? [コピー]

都市の人口情報を含むファイルがあります。この都市のサブセットの名前のリストである別のファイルがあります。 2番目のファイルを使用して、最初のファイルから人口統計情報を選択したいと思います。どうすればいいですか?

例:

ファイル1:ma-towns.txt

Acton   Town    Middlesex   Open town meeting   21,924  1735  
Acushnet    Town    Bristol Open town meeting   10,303  1860  
Adams   Town    Berkshire   Representative town meeting 8,485   1778  
Agawam  City[4] Hampden Mayor-council   28,438  1855  
Alford  Town    Berkshire   Open town meeting   494 1773  
Amesbury    City    Essex   Mayor-council   16,283  1668  
Amherst Town    Hampshire   Representative town meeting 37,819  1775  

ファイル2:town-list.txt

Acton  
Adams  
Agawam 

希望の出力は

Acton   Town    Middlesex   Open town meeting   21,924  1735  
Adams   Town    Berkshire   Representative town meeting 8,485   1778  
Agawam  City[4] Hampden Mayor-council   28,438  1855   

基本的に言ったように、その行にファイル2の文字列が含まれている場合は、その行を抽出します。

答え1

grep -f <(sed 's/.*/\^&\\>/' town-list.txt) ma-towns.txt

説明する:

grep -f filefile一致させるパターンのリストを読みます。ma-towns.txtのパターンを使用してリストから検索しますtown-list.txt。各行は新しいパターン、つまり新しいクエリと見なされます。

sedしかし、それだけでは十分ではなかったので、次のように検索語のフォーマットを指定するために1つを追加しました。

^Acton\>
^Adams\>
^Agawam\>

^grepは行の先頭のパターンにのみ一致し、\>grepはその点の単語の終わりにのみ一致します。

これにより、検索語は行の先頭(都市名がある場所)のみを確認し、検索語は都市名の終わりで終わる必要があります。


sedコマンド自体は、s形式の(代替)コマンドを実行しますs/search/replace/

クエリが.*行全体と一致します。置換、\^&\\>リテラル文字に置き換え、^元の行とテキストに置き換えます\>


この回答は、他の回答が実行しない機能を実行します。

  • ダッシュで始めるか、バックスラッシュを含む都市名を処理します(これは可能性は低いですが、ユーザーが入力した場合は予測不可能な方法でスクリプトを中断したくありません)。どちらの回答も、都市名を文字通りの検索語ではなく正規表現として扱います。
  • ma-towns.txtで指定されているように元の順序で村を出力します。
  • より良い成果を上げる
  • 行のどこかではなく、行の先頭で都市名を検索してください。
  • 部分文字列が 1 つだけ一致すると、都市は一致しません (例: Waterloowill not match Waterlooville)。

答え2

その後、次の行を読み、file2次をfile1使用してgrep解析します。

while read line; do
  grep "${line}" file1
done < file2

関連情報