Linux

文本文件:查找字元串,將字元串欄位保存到 var,查找第二個字元串,用 var 替換欄位,重複到結束

  • March 13, 2019

我認為這最好用 AWK 來完成,但不確定。它整天困擾著我如何做到這一點。我有一個文本文件,行中的欄位之間帶有 * 分隔符。我需要搜尋以 L111Z 開頭的行並將值保存到以 1Z 開頭但不包括下一個 * 的變數或緩衝區(即行上的第二個欄位),在第一種情況下,這將是 1ZXDF430。然後我需要轉到以 BGN 開頭的下一行並將字元串 QVD(即該行的第三個欄位)替換為變數的值。我需要對文件中的所有 L111Z 和以下 BGN 行執行此操作。如果可能的話,最好輸出一個新文件而不是覆蓋輸入文件。

輸入文件

xxx  
L11*123456*CR  
yyy  
L11*1ZXDF430*2I*04  
zzz  
BGN*00*QVD*123456  
fff  
L11*768907*CR  
L11*12345678*CR  
xxx  
L11*1ZXDF499*2I*04  
zzz  
BGN*00*QVD*123456  
xxx  

結果輸出文件

xxx  
L11*123456*CR  
yyy  
L11*1ZXDF430*2I*04  
zzz  
BGN*00*1ZXDF430*123456  
fff  
L11*768907*CR  
L11*12345678*CR  
xxx  
L11*1ZXDF499*2I*04  
zzz  
BGN*00*1ZXDF499*123456  
xxx  

假設BGN在 each 之後有一個L11*1Z,那麼你應該可以使用

$ awk 'BEGIN{OFS=FS="*"} /^L11\*1Z/ {x = $2} /^BGN/ {$3 = x} 1' file
xxx
L11*123456*CR
yyy
L11*1ZXDF430*2I*04
zzz
BGN*00*1ZXDF430*123456
fff
L11*768907*CR
L11*12345678*CR
xxx
L11*1ZXDF499*2I*04
zzz
BGN*00*1ZXDF499*123456
xxx

引用自:https://unix.stackexchange.com/questions/505983