file1からfile2までのgrepパターン列

file1からfile2までのgrepパターン列

2つのファイルがあります。

$ cat File1
A
B
C
$ cat File2
A aaa B
D bbb A
B aaa h

File1でパターンを検索したいですFile2。これは可能な方法ですが、で報告されたパターンのみをgrep -f File1 File2検索します。File1$1File2

出力例:

$cat File3
A aaa B
B aaa h

答え1

そしてawk

awk 'NR==FNR{a[$0]=NR; next} a[$1]' f1.txt f2.txt
  • NR==FNR{a[$0]=NR; next}:最初のファイル(f1.txt)の場合は、レコードを連想配列のキーとして、そのレコード番号を値として取ります。

  • a[$1]:2番目のファイル(f2.txt)の場合、最初のフィールドが配列のキーである場合にのみレコードを印刷します。a

例:

% cat f1.txt                                       
A
B
C

% cat f2.txt                                       
A aaa B
D bbb A
B aaa h

% awk 'NR==FNR{a[$0]=NR; next} a[$1]' f1.txt f2.txt
A aaa B
B aaa h

答え2

使用joinコマンド:

join <(sort file1) <(sort file2)

ファイルがソートされている場合。

join file1 file2

答え3

bashプロセス置換を理解するシェルを使用してください。

$ grep -f <( awk '{ printf("^%s[[:blank:]]\n", $0) }' File1 ) File2
A aaa B
B aaa h

ここでのアイデアは、fromの各行をgrep -f File1直接使用するための正規表現に変換して正しいパターンを生成することです(前に曲折符号があり、後に接尾辞が付きますFile2Filesomething^something[[:blank:]][[:blank:]])。

曲折はパターンを行の先頭に固定し、[[:blank:]]スペースやタブに一致するように強制します。

GNUはgrep標準入力からパターンを読み取ることもできます。

$ awk '{ printf("^%s[[:blank:]]\n", $0) }' File1 | grep -f - File2
A aaa B
B aaa h

必要に応じて、このawkコマンドを同等のコマンドに置き換えることができます。sedsedawk

$ sed -e 's/^/^/' -e 's/$/[[:blank:]]/' File1 | grep -f - File2

関連情報