ある行で見つかった値を最初の行の特定のフィールドに一致する別の行に追加する

ある行で見つかった値を最初の行の特定のフィールドに一致する別の行に追加する

あなたのすべてがうまくいくことを願っています!

これが私が達成したいものです:

次の行があります。

2022-10-19 09:12:39.174 WRITING bytes(2566), indexname(20220701_cfgsys_017507001635)
2022-10-19 09:12:39.334 WRITING bytes(4301), indexname(20220601_cfgsys_017507001635)
2022-10-19 09:12:39.334 Sent bytes (2566) successfully
2022-10-19 09:12:39.334 WRITING bytes(1293), indexname(20220701_cfgsys_017507001635)
2022-10-19 09:12:39.398 Sent bytes (4301) successfully
2022-10-19 09:12:39.398 WRITING bytes(7285), indexname(20220601_cfgsys_017507001635)
2022-10-19 09:12:39.890 Sent bytes (1293) successfully
2022-10-19 09:12:39.890 WRITING bytes(4289), indexname(20220701_cfgsys_017507001635)
2022-10-19 09:12:40.123 Sent bytes (7285) successfully

内部の値を取得したい。インデックス名「WRITING」に一致する行に角かっこを追加し、「Sent bytes」に一致する行の末尾に追加します。バイトブラケットのマッチング。

たとえば、希望の出力は次のようになります。

2022-10-19 09:12:39.174 WRITING bytes(2566), indexname(20220701_cfgsys_017507001635)
2022-10-19 09:12:39.334 WRITING bytes(4301), indexname(20220601_cfgsys_017507001635)
2022-10-19 09:12:39.334 Sent bytes (2566) successfully 20220701_cfgsys_017507001635
2022-10-19 09:12:39.334 WRITING bytes(1293), indexname(20220701_cfgsys_017507001635)
2022-10-19 09:12:39.398 Sent bytes (4301) successfully 20220601_cfgsys_017507001635
2022-10-19 09:12:39.398 WRITING bytes(7285), indexname(20220601_cfgsys_017507001635)
2022-10-19 09:12:39.890 Sent bytes (1293) successfully 20220701_cfgsys_017507001635
2022-10-19 09:12:39.890 WRITING bytes(4289), indexname(20220701_cfgsys_017507001635)
2022-10-19 09:12:40.123 Sent bytes (7285) successfully 20220601_cfgsys_017507001635

角かっこ内の2つの値(バイト名とインデックス名)を取得する方法を知っています。

cat test.txt | grep "WRITING" | awk -F"[()]" '{print $2" "$4}'

$2 = 括弧内のバイト値 $4 = 括弧内のインデックス名の値

ただし、必要な行に追加することはできません。次の行(「WRITING」の後ろ)で「Sent bytes」文字列を検索し、$ 2は「Sent bytes」行の$ 2と等しく、$ 4を追加する必要があります。 「すでにバイトを送る」行末で

どんな助けでも大変感謝します!

よろしくお願いします!

答え1

awkを使用してください。

$ cat tst.awk
BEGIN { FS = "[() ]+" }
($3 == "WRITING") && ($7 == "indexname") { idx[$5] = $8 }
(($3" "$4) == "Sent bytes") && ($5 in idx) { $0 = $0 OFS idx[$5] }
{ print }

$ awk -f tst.awk file
2022-10-19 09:12:39.174 WRITING bytes(2566), indexname(20220701_cfgsys_017507001635)
2022-10-19 09:12:39.334 WRITING bytes(4301), indexname(20220601_cfgsys_017507001635)
2022-10-19 09:12:39.334 Sent bytes (2566) successfully 20220701_cfgsys_017507001635
2022-10-19 09:12:39.334 WRITING bytes(1293), indexname(20220701_cfgsys_017507001635)
2022-10-19 09:12:39.398 Sent bytes (4301) successfully 20220601_cfgsys_017507001635
2022-10-19 09:12:39.398 WRITING bytes(7285), indexname(20220601_cfgsys_017507001635)
2022-10-19 09:12:39.890 Sent bytes (1293) successfully 20220701_cfgsys_017507001635
2022-10-19 09:12:39.890 WRITING bytes(4289), indexname(20220701_cfgsys_017507001635)
2022-10-19 09:12:40.123 Sent bytes (7285) successfully 20220601_cfgsys_017507001635

答え2

使用awk

$ awk -F"[()]" '/indexname/{var=$4}/Sent bytes/{$(NF+1)=var}1' input_file
2022-10-19 09:12:39.174 WRITING bytes(2566), indexname(20220701_cfgsys_017507001635)
2022-10-19 09:12:39.334 WRITING bytes(4301), indexname(20220601_cfgsys_017507001635)
2022-10-19 09:12:39.334 Sent bytes  2566  successfully 20220601_cfgsys_017507001635
2022-10-19 09:12:39.334 WRITING bytes(1293), indexname(20220701_cfgsys_017507001635)
2022-10-19 09:12:39.398 Sent bytes  4301  successfully 20220701_cfgsys_017507001635
2022-10-19 09:12:39.398 WRITING bytes(7285), indexname(20220601_cfgsys_017507001635)
2022-10-19 09:12:39.890 Sent bytes  1293  successfully 20220601_cfgsys_017507001635
2022-10-19 09:12:39.890 WRITING bytes(4289), indexname(20220701_cfgsys_017507001635)
2022-10-19 09:12:40.123 Sent bytes  7285  successfully 20220701_cfgsys_017507001635

関連情報