
2つのファイルがあります。
$ cat File1
A
B
C
$ cat File2
A aaa B
D bbb A
B aaa h
File1
でパターンを検索したいですFile2
。これは可能な方法ですが、で報告されたパターンのみをgrep -f File1 File2
検索します。File1
$1
File2
出力例:
$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
直接使用するための正規表現に変換して正しいパターンを生成することです(前に曲折符号があり、後に接尾辞が付きますFile2
File
something
^something[[:blank:]]
[[:blank:]]
)。
曲折はパターンを行の先頭に固定し、[[:blank:]]
スペースやタブに一致するように強制します。
GNUはgrep
標準入力からパターンを読み取ることもできます。
$ awk '{ printf("^%s[[:blank:]]\n", $0) }' File1 | grep -f - File2
A aaa B
B aaa h
必要に応じて、このawk
コマンドを同等のコマンドに置き換えることができます。sed
sed
awk
$ sed -e 's/^/^/' -e 's/$/[[:blank:]]/' File1 | grep -f - File2