複数の列を含むファイルから grep

複数の列を含むファイルから grep

数字がタブで区切られたsomeNumbers.txtというファイルがあります。たとえば、次のようになります。

1   1
2   1
5   1
7   1
10  1

数字を含む他のファイル(例:EvenNumbers.txt)で、someNumbers.txtの最初の列の数字を検索したいと思います。

2   1
4   1
6   1
8   1
10  1

私が望む出力は次のとおりです。

2   1
10  1

より単純なシナリオでは、someNumbers.txtは次のようになります。

1
2
5
7
10

EvenNumbers.txtは次のとおりです。

2
4
6
8
10

私はただできます。

grep -f someNumbers.txt evenNnumbers.txt

出力を取得します。

2
10

ファイルがタブで区切られている場合はどうすればよいですか?ありがとう

答え1

ロジックが列として定義されている場合は、awkデフォルトの構文解析行を使用してフィールドに分割する方が簡単な場合もあります。したがって、行の先頭を一致させたり、スペースを気にする必要はありません。この例:

grep -Ff file2 file1

次のように書くことができます:

awk 'FNR==NR{map[$0]; next} $0 in map' file2 file1

各ファイルに2つの列があり、上記の内容を変更したい場合は、最初のフィールド$0$1)の行全体を見つけるのではなく、各ファイルの最初の列だけを考慮するのは非常に簡単です。

awk 'FNR==NR{map[$1]; next} $1 in map' file2 file1

grep を使用すると、最初のファイルの最初の列だけが保持され、フィールドの境界と一致します。

grep -f <(awk '{print "^" $1 "[[:space:]]"}' file2) file1

行の先頭と次のスペースを一致させることも、行の終わりも一致させることもできます。そして、もはや固定されたパターンが見つかりません。フィールド(たとえば、2番目のフィールドの一致)またはフィールドの区切り文字を変更する場合は、より多くの作業が必要です。 Divisionを使用すると、awkこれらの問題については考えられません。

答え2

注文する

awk 'NR==FNR {a[$1];next}($1 in a){print $0}' someNumbers.txt evenNumbers.txt

出力

2   1
10  1

関連情報