都市の人口情報を含むファイルがあります。この都市のサブセットの名前のリストである別のファイルがあります。 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 file
file
一致させるパターンのリストを読みます。ma-towns.txt
のパターンを使用してリストから検索しますtown-list.txt
。各行は新しいパターン、つまり新しいクエリと見なされます。
sed
しかし、それだけでは十分ではなかったので、次のように検索語のフォーマットを指定するために1つを追加しました。
^Acton\>
^Adams\>
^Agawam\>
^
grepは行の先頭のパターンにのみ一致し、\>
grepはその点の単語の終わりにのみ一致します。
これにより、検索語は行の先頭(都市名がある場所)のみを確認し、検索語は都市名の終わりで終わる必要があります。
sedコマンド自体は、s
形式の(代替)コマンドを実行しますs/search/replace/
。
クエリが.*
行全体と一致します。置換、\^&\\>
リテラル文字に置き換え、^
元の行とテキストに置き換えます\>
。
この回答は、他の回答が実行しない機能を実行します。
- ダッシュで始めるか、バックスラッシュを含む都市名を処理します(これは可能性は低いですが、ユーザーが入力した場合は予測不可能な方法でスクリプトを中断したくありません)。どちらの回答も、都市名を文字通りの検索語ではなく正規表現として扱います。
- ma-towns.txtで指定されているように元の順序で村を出力します。
- より良い成果を上げる
- 行のどこかではなく、行の先頭で都市名を検索してください。
- 部分文字列が 1 つだけ一致すると、都市は一致しません (例:
Waterloo
will not matchWaterlooville
)。
答え2
その後、次の行を読み、file2
次をfile1
使用してgrep
解析します。
while read line; do
grep "${line}" file1
done < file2