文本文件:查找字符串,将字符串字段保存到var,查找第二个字符串,用var替换字段,重复到结束

文本文件:查找字符串,将字符串字段保存到var,查找第二个字符串,用var替换字段,重复到结束

我认为这最好用 AWK 来完成,但不确定。如何做到这一点一直困扰着我一整天。我有一个文本文件,行上的字段之间带有 * 分隔符。我需要搜索以 L11*1Z 开头的行,并将值保存到以 1Z 开头的变量或缓冲区,但不包括下一个 * (即该行的第二个字段),在第一种情况下,这将是 1ZXDF430。然后我需要转到以 BGN 开头的下一行,并将字符串 QVD(即该行的第三个字段)替换为变量的值。我需要对文件中找到的所有 L11*1Z 和以下 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  

答案1

BGN假设每个后面都有一个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

相关内容