File1各行には数字(0〜9桁)が含まれており、レコードの総数は20kです。 File2 最初の列には数字 (0 ~ 9 桁) が含まれ、各行にはその他の情報が含まれており、合計レコード数は 46,000,00 の両方のファイルがソートされています。 file1 に共通項目があるすべてのレコードに対して file2 を grep する必要があります。
ファイル1
988676562
99373
133838000
ファイル2
99373 dhdhdhdhd, 3838 dheueie,aaaa
133838000 rrtyusbjsjs,382 djdjdjsusu
2233747 Eheueueu. ,446,ttttiieenjs
44577333 Euedjdbebe,777,rrididjd
出力
99373 dhdhdhdhd, 3838 dheueie,aaaa
133838000 rrtyusbjsjs,382 djdjdjsusu
試しましたが、fgrep -f file1 file2
出力は0です。
明確にすると、両方のファイルの最初の列はまったく同じです。
答え1
File1
あなたの行に空の行が含まれているかどうかはわかりません。だから数字のない行は無視するようにしました。また、あなたの例にはFile1
末尾のスペースが含まれているようです。これにより、数字以外の文字の前後のすべての文字が削除されます。
このファイルを使用してsed
スキーマを生成し、grep
結果をスキーマファイルgrep
としてFile2
。
grep -f <(grep '[0-9]' File1 | sed 's/[^0-9]*\([0-9]*\).*/^\1[^0-9]*.*$/' ) File2
この印刷
99373 dhdhdhdhd, 3838 dheueie,aaaa
133838000 rrtyusbjsjs,382 djdjdjsusu
説明する:
数値を含む行の抽出
grep '[0-9]' File1
grep
可能な先行および末尾のゴミを削除し、行の先頭から数字を探し、数字以外の文字やその他の文字が続くか、行末まで何も見つからないパターンを作成します。
sed 's/[^0-9]*\([0-9]*\).*/^[^0-9]*\1[^0-9]*.*$/'
答え2
この種の作業にjoin
非常に便利です。結合を使用すると、両方のファイルが列に基づいてソートされ、両方のファイルの列が同じであることに注意してください。
これが解決策です
sort -o file1 file1 #sort and save content of file1
sort -o file2 file2 #sort and save content of file2
join file1 file2
答え3
考えられる解決策の1つ(空白行の確認):
while read line; do [ ${#line} -gt 0 ] && grep "$line" File2; done < File1
答え4
次のコマンドを使用してテストすると、うまく動作します。
注文する
プラビン@フラビン:~$awk 'NR==FNR{a[$1];next}($1 in a){print $0}' file1 file2
出力
プラビン@フラビン:~$awk 'NR==FNR{a[$1];next}($1 in a){print $0}' file1 file2
99373 dhdhdhdhd, 3838 dheueie,aaaa
133838000 rrtyusbjsjs,382 djdjdjsusu