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
。したがって、私の結果は次のようになります。File1
xyz
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=
\1
P
d
追加出力を抑制します。-n
代わりにオプションを使用できます
アップデート:視覚的な説明
Edが指摘したように、私の説明は明らかにすべての人に役立つわけではありません。あなたが「視覚的思考」に近い場合は、これがどのように機能するかを説明しようとします。これはsed
プログラミングツールではなく、次の機能を備えた自動テキストエディタに近いです。スペアスペース行を読みながら「クリップボード」として使用パターン空間、作業が完了したところです。
これで、提案されているとH
コマンドG
の後に2つのスペースが表示されます。
パターン空間 | スペアスペース | コメント |
---|---|---|
1234 |
1234 |
H (空)予約済みスペースに追加して改行を含める |
1234 1234 |
1234 |
G パターンスペースに再度追加し、別の改行を追加します。 |
5678 |
1234 5678 |
次の行を読み取ると、予約されたスペースが保持されるため、次の行H には次の番号が追加されます。 |
5678 1234 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`