0

これは私が書いたスクリプトです

zgrep -i xxxx FileA | grep -o "RID=[0-9|A-Z]*" | uniq | cut -d "=" -f2 | xargs

xargs私のo / pが使用される前に

01982893213982312 - RID 1
32103213213213213 - RID 2
32103213213213343 - RID 3
32103213213251261 - RID 4

ここに存在するすべての RID に対して、ファイル B に対応する行があります。

zgrep -i xxxx FileA | grep -o "RID=[0-9|A-Z]*" | uniq | cut -d "=" -f2 | xargs|
{grep RID1 in file B, grep RID2 in file B,grep RID3 in file B, grep RID4 in file B}

今、私の唯一の質問は、RID1,2,3,4 を xargs で参照する方法です....

4

2 に答える 2

0

FileAのデータが1行に1つのRIDである場合、明白な選択は(古典的に)fgrepまたは(より現代的な表記法を使用して)grep -Fです。2004バージョンではPOSIXが標準化されていませんfgrep(に置き換えられています)。grep -Fただし、fgrep血統は非常に長いです。たとえば、1978年頃の第7版UNIX™の一部でした。

fgrep -f FileA FileB
grep -F -f FileA FileB

FileAのデータが「1行に1つのRID」形式でない場合は、そうしてください。


しかし、fgrepはコンソールからi/pを読み取りますか

あなたがそれを言うならそれはします、しかしあなたはそれがコンソールから読まれるのを望まないでしょう。標準入力から読み取ってほしい。「コンソール入力」は、大まかに「入力する」ことを意味します。grep -F(とはいえ、「コンソール」(ターミナル)を使用しgrep -F -f - /etc/passwdて入力し、EOFを表示することで、の動作を確認し/bin/ました。正常に機能しました。)

を使用している場合はbash、「プロセス置換」を使用して、必要な結果を得ることができます。

grep -F -f <(zgrep -i xxxx FileA | grep -o "RID=[0-9|A-Z]*" | uniq | cut -d "=" -f2) FileB

プロセス置換は、<( ... )その出力が「ファイル」(実際には、通常はのファイル記述子)に送られるようにコマンドを内部で実行し、名前は通常のファイル名引数として/dev/fdコマンド()に与えられます。grep

を使用していない場合はbash、代わりにこれを使用できます(これも問題なく機能しbash、望ましい場合もあります)。

zgrep -i xxxx FileA | grep -o "RID=[0-9|A-Z]*" | uniq | cut -d "=" -f2 |
grep -F -f - FileB

唯一のダッシュは、このコンテキストでは「標準入力からの読み取り」を意味します。これはコマンドの一般的な規則です。Mac OSX10.7.4では正常に動作します。他の場所でも機能する可能性が高いです。

于 2012-06-20T02:13:11.717 に答える
0

これを行うもう 1 つの方法は、次のようなデータをパイプすることです。

script1 fileA | script2 fileB

このアプローチにより、より多くの引数を渡し、fileB を介してストリーミングできます。

于 2012-06-20T02:05:12.913 に答える