3

申し訳ありませんが、この質問のタイトルは少しわかりにくいですが、他に何も考えられませんでした。私はこのようなことをしようとしています

cat fileA.txt | grep `awk '{print $1}'` fileB.txt

fileA には 100 行が含まれ、fileB には 1 億行が含まれています。

私が欲しいのは、fileAからIDを取得し、そのIDを別のfile-fileBにgrepして、その行を出力することです。

e.g fileA.txt
1234
1233

e.g.fileB.txt
1234|asdf|2012-12-12
5555|asdd|2012-11-12
1233|fvdf|2012-12-11

期待される出力は

1234|asdf|2012-12-12
1233|fvdf|2012-12-11
4

3 に答える 3

11

完全にcat取り除く:awk

grep -f fileA.txt fileB.txt
于 2013-01-10T22:28:33.553 に答える
4

awk だけでその仕事をうまく行うことができます:

awk -F'|' 'NR==FNR{a[$0];next;}$1 in a' fileA fileB

テストを参照してください:

kent$  head a b
==> a <==
1234
1233

==> b <==
1234|asdf|2012-12-12
5555|asdd|2012-11-12
1233|fvdf|2012-12-11

kent$  awk -F'|' 'NR==FNR{a[$0];next;}$1 in a' a b
1234|asdf|2012-12-12
1233|fvdf|2012-12-11

編集

説明を追加:

-F'|'  #| as field separator (fileA)
'NR==FNR{a[$0];next;} #save lines in fileA in array a
 $1 in a  #if $1(the 1st field) in fileB in array a, print the current line from FileB

詳細については、ここでは説明できません。申し訳ありません。たとえば、awk が NR と FNR の 2 つのファイルを処理する方法などです。もう少し深く掘り下げたい場合は、いくつかの awk チュートリアルを読んでください。

于 2013-01-10T22:48:07.160 に答える
1

ID が個別の行にある場合は、次のように-fオプションを使用できますgrep

cut -d "|" -f1 < fileB.txt | grep -F -f fileA.txt

このcutコマンドは、 を使用したパターン検索で最初のフィールドのみが検索されるようにしgrepます。

マニュアルページから:

-f FILE, --file=FILE
Obtain patterns from FILE, one per line.  
The empty file contains zero patterns, and therefore matches nothing.
(-f is specified by POSIX.)
于 2013-01-10T22:28:04.363 に答える