ファイル内の1行の最初の単語をGrepします。

ファイル内の1行の最初の単語をGrepします。

だから良いfile.txtです。

John [email protected]
Mary [email protected]

しかし、私もいます。

Pickethunter123 [email protected]
XPC61 [email protected]
GeorgeBushSucks [email protected]

英語名のリストがありますnames.txt。行の最初の単語だけで別のファイルをgrepする方法はありますか?

答え1

正規表現がパターンの先頭にのみ一致するようにするには、^ファイルの各行に行アンカーを追加できますnames.txt。ファイルを現在の場所から変更したくない場合は、次のコマンドを使用してすぐに変更できますsed

sed 's/^/^/' names.txt | grep -wf - file.txt

結果をgrep -f標準入力に渡します-

あるいは、区切りデータの場合、awkは良い選択です。

awk 'NR==FNR{fn[$1]; next} $1 in fn' names.txt file.txt

答え2

これを接続してくださいあなたのより早い質問、コンテンツを含むJSONドキュメントがある場合

{"a":"town, state, country","e":["[email protected]"],"n":"john smith"}
{"a":"town, state, country","e":["[email protected]","[email protected]"],"n":"zac surname"}
{"a":"town, state, country","n":"jane doe"}

名前リスト(n各キー値の最初の空白文字の前の値)とe値の電子メールアドレスを抽出するには、次の方法をお勧めjqします。

jq -r '
    select(has("n") and has("e")) |
    (.n|split(" ")[0]) as $name |
    .e[] | [ $name, . ] | @tsv' file.txt

(望むより私の以前の答えこのコマンドの簡単な説明)。

有効な名前リストの読み取りを含めるように変更できます。

jq -Rs 'rtrimstr("\n") | split("\n") | map(ascii_upcase)' names.txt |
jq -r '
    . as $valid_names |
    inputs | select(has("n") and has("e")) |
    (.n|split(" ")[0]) as $name | select(($name | ascii_upcase) == $valid_names[]) |
    .e[] | [ $name, . ] | @tsv' - file.txt

これはjq2回呼び出されます。最初の呼び出しは、names.txt名前のリスト(1行に1つの名前であると仮定)を大文字の文字列のJSON配列に変換することです。

たとえば、names.txtファイルに次のものが含まれている場合

marty
zac

その後、最初のjq呼び出しはJSONドキュメントを生成します。

[
  "MARTY",
  "ZAC"
]

2番目の呼び出しは、最初の呼び出しを読み取り、jq大文字の名前リストからコレクションを作成することから始まります。$valid_names

その後、この関数はJSONオブジェクトを1つずつ読み取るinputsために使用されます。残りは、データを最初の項目に限定する追加の操作を実行することを除いて、前の回答で行った操作と非常によく似ています。名前がnameと一致する項目のセット。file.txtselect$valid_names

names.txt上記の例のファイルとfile.txtこの回答の先頭にあるファイルを使用すると、出力は1行になります。

zac     [email protected]
zac     [email protected]

答え3

変換ファイルを使用しcutgrepコマンドにパイプすることができます。

cut -d' ' -f1 file.txt | grep -F -f names.txt

関連情報