数字がタブで区切られた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