file1に存在するfile2にも同じ行が必要です。

file1に存在するfile2にも同じ行が必要です。

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

関連情報