2 つの大きなファイル間の Grep または awk。ここで、file1 はパターン・ファイル、file2 はデータを含みます。

2 つの大きなファイル間の Grep または awk。ここで、file1 はパターン・ファイル、file2 はデータを含みます。

File1固定長の数字があり、1行に数字が1つずつあります。

1234
5678
1345

File2「key=value」形式のデータフィールドを含みます。

abc:def=1999,xyz=1234;
abc:def=5678,xyz=1234;
abc:def=1234,xyz=5678;

フィールドはの数字と一致する行を取得する必要がありますFile2が、パターン一致中にフィールドは無視されますdef。したがって、私の結果は次のようになります。File1xyz

abc:def=5678,xyz=1234;
abc:def=1234,xyz=5678;

ベストアンサー1

私はいつもほとんどのawk命令を忘れてしまい、それは私の古い脳にはあまりにも負担がかかるので、代替手段を提供しますsed

sed '/^[0-9]*$/H;G;/def=\([0-9]*\),.*\n\1/P;d' file1 file2

アイデアは、予約済みスペースから数字を収集し、file1逆参照を使用して、次の数字を含むfile2の対応する行を識別することです。def=

  • このパターンは、^[0-9]*$数値のみを含む行と一致します。これは行で、前のスペースfile1に追加します。H
  • G予約済みスペースをパターンスペースに追加して、パターンスペースに行とfile2すべての数字を含めます。file1
  • このパターンは、改行文字の後に/def=\([0-9]*\),.*\n\1次の数字(逆参照)が繰り返されるすべての行を処理します(したがって、予約された空間セットの一部です)。詳細なしで行を印刷するdef=\1P
  • d追加出力を抑制します。-n代わりにオプションを使用できます

アップデート:視覚的な説明

Edが指摘したように、私の説明は明らかにすべての人に役立つわけではありません。あなたが「視覚的思考」に近い場合は、これがどのように機能するかを説明しようとします。これはsedプログラミングツールではなく、次の機能を備えた自動テキストエディタに近いです。スペアスペース行を読みながら「クリップボード」として使用パターン空間、作業が完了したところです。

これで、提案されているとHコマンドGの後に2つのスペースが表示されます。

パターン空間 スペアスペース コメント
1234 1234 H(空)予約済みスペースに追加して改行を含める
1234␤␤1234 1234 Gパターンスペースに再度追加し、別の改行を追加します。
5678 1234␤␤5678 次の行を読み取ると、予約されたスペースが保持されるため、次の行Hには次の番号が追加されます。
56781234␤␤␤5678 1234␤␤5678 パターン空間に再度追加されますが、まだdef=パターンと一致しません。
file1読みやすくするために3行目をスキップしてください。
abc:def=1999,xyz=1234; 1234␤␤5678 パターンと一致しないため^[0-9]*$実行されませHん。
abc:def=1999,xyz=1234;1234␤␤␤5678 1234␤␤5678 しかしG処刑された

P次に、コマンドのアドレスパターンを適用する方法を見てください(\n改行文字のプレースホルダとして使用されます)。

abc:def=1999,xyz=1234;\n\n1234\n5678
    def=####,         .*                 #### stands for `[0-9]*`, but the back reference
                                         as `\1` is not found: no match

abc:def=5678,xyz=1234;\n\n1234\n5678
    def=####,         .*      \n####     here, the match is repeated as `\1`,so we know
                                         the `def` number has been listed in `file1` 

おすすめ記事