だから良い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
これはjq
2回呼び出されます。最初の呼び出しは、names.txt
名前のリスト(1行に1つの名前であると仮定)を大文字の文字列のJSON配列に変換することです。
たとえば、names.txt
ファイルに次のものが含まれている場合
marty
zac
その後、最初のjq
呼び出しはJSONドキュメントを生成します。
[
"MARTY",
"ZAC"
]
2番目の呼び出しは、最初の呼び出しを読み取り、jq
大文字の名前リストからコレクションを作成することから始まります。$valid_names
その後、この関数はJSONオブジェクトを1つずつ読み取るinputs
ために使用されます。残りは、データを最初の項目に限定する追加の操作を実行することを除いて、前の回答で行った操作と非常によく似ています。名前がnameと一致する項目のセット。file.txt
select
$valid_names
names.txt
上記の例のファイルとfile.txt
この回答の先頭にあるファイルを使用すると、出力は1行になります。
zac [email protected]
zac [email protected]
答え3
変換ファイルを使用しcut
てgrep
コマンドにパイプすることができます。
cut -d' ' -f1 file.txt | grep -F -f names.txt