每次查找,添加,替换 - 按顺序

时间:2017-08-14 14:13:32

标签: unix awk sed

我有这样的输入,我想附加一个值,它应该为下一个找到的ID添加值,它应该按顺序递增它在文件中找到的每个值

简而言之,找到FR:(516554)& AT:(929121)并向其添加序号并用新生成的值FR替换该值:(516554001)& AT:(929121001)

我的输入文件'NKN + S:KSSSS + FR:516554 + 20020716 ++ 2'NKN + S:KSSSS + AT:929121 + 19991116 ++ 2'' NKN + S:KSSSS + FR:516555 + 20020716 ++ 2'NKN + S:KSSSS + AT:929122 + 19991116 ++ 2''NKN + S:KSSSS + FR:516556 + 20020716 ++ 2'NKN + S:KSSSS +的 AT:929123 + 19991116 ++ 2'

输出文件应该是这样的'NKN + S:KSSSS + FR:516554001 + 20020716 ++ 2'NKN + S:KSSSS + AT:929121001 +19991116+ +2''NKN + S:KSSSS + FR:516555002 + 20020716 ++ 2'NKN + S:KSSSS + AT:929122002 + 19991116 ++ 2''NKN + S :KSSSS +的 FR:516556003 + 20020716 ++ 2'NKN + S:KSSSS +的 AT:929123003 + 19991116 ++ 2'

非常感谢提前

干杯

2 个答案:

答案 0 :(得分:0)

如果您在生成00x格式编号时遇到问题:

kent$  seq 10|awk '{printf "%03d\n",$0}'
001
002
003
004
005
006
007
008
009
010

对于您的问题,您可以将FSOFS设置为+并检查该字段是否以FR:/AT:开头,以确定是否应添加序列:

awk -F'+' -v OFS="+" 
'{s=sprintf("%03d",NR);for(x=1;x<=NF;x++)$x=$x ($x~/^AT:|^FR:/?s:"")}7' input

答案 1 :(得分:0)

awk 解决方案:

awk '$0~/FR|AT/{ c++; gsub(/(FR|AT):[0-9]+/,"\&"sprintf("%03d",c),$0) }1' file

输出:

'NKN+S:KSSSS+FR:516554001+20020716++2'NKN+S:KSSSS+AT:929121001+19991116++2' 
'NKN+S:KSSSS+FR:516555002+20020716++2'NKN+S:KSSSS+AT:929122002+19991116++2'
'NKN+S:KSSSS+FR:516556003+20020716++2'NKN+S:KSSSS+AT:929123003+19991116++2'