AWK搜索特定序列,如果找到,则在下一行搜索另一个序列版本2

AWK搜索特定序列,如果找到,则在下一行搜索另一个序列版本2,awk,Awk,我试图找到一个txt格式的字符串,每次找到它,然后寻找一个特定的字符串来更改另一个字符串,避免读取行的第一个序列 想象一下nexts十六进制txt: 0000 09 06 07 04 00 00 01 00 1d 03 78 2c a1 2a 02 01 0010 b7 09 01 47 30 22 a0 0a 4b 08 33 04 03 92 22 14 0020 17 f0 a1 0b 80 00 81 00 84 01 00 86 00 85 00 83 0030

我试图找到一个txt格式的字符串,每次找到它,然后寻找一个特定的字符串来更改另一个字符串,避免读取行的第一个序列

想象一下nexts十六进制txt:

0000  09 06 07 04 00 00 01 00 1d 03 78 2c a1 2a 02 01   
0010  b7 09 01 47 30 22 a0 0a 4b 08 33 04 03 92 22 14   
0020  17 f0 a1 0b 80 00 81 00 84 01 00 86 00 85 00 83   
0030  07 91 94 71 06 00 07 19

0000  09 06 07 04 00 00 01 00 2b 03 4b 27 a1 25 02 01   
0010  00 09 01 66 30 4b a0 0a 80 08 33 04 03 92 22 14   
0020  17 f0 a1 06 82 00 84 00 85 00 82 07 91 94 71 06   
0030  00 07 19
预期产出:

0000  09 06 07 04 00 00 01 00 1d 03 78 2c a1 2a 02 01   
0010  b7 09 01 47 30 22 a0 0a 4b 08 33 04 03 92 22 25   
0020  17 f0 a1 0b 80 00 81 00 84 01 00 86 00 85 00 83   
0030  07 91 94 71 06 00 07 19

0000  09 06 07 04 00 00 01 00 2b 03 4b 27 a1 25 02 01   
0010  00 09 01 66 30 4b a0 0a 80 08 33 04 03 92 22 25   
0020  17 f0 a1 06 82 00 84 00 85 00 82 07 91 94 71 06   
0030  00 07 19
我需要在每次遇到4b序列时查找14序列,如果找到,则在下一行中查找第一个字符串,在本例中为17,如果该字符串为17,则将14更改为25。左边是一个序列,它给出了txt的行,所以分析起来并不有趣,因为它在每个段落中重复

我拥有的是下一个:

gawk  ' { for ( i = 1; i <= NF; ++i ) {

    if ( $i == "4b" )
        r = 1
    if ( r && ($i == "14" ))
        t = 1

  }
}
1 ' example.txt example2.txt

主要问题是,我不知道如何使用
gnu awk
验证14是否是下一行的第二个字段,您可以尝试以下方法:

awk-vrs='{ORS=RT}{$0=gensub(/(\s4b\s(+++\s)?)14([:blank:]*\n\s+[:blank:]+17\s)/,“\\125\\3”,1)}1”文件
0000 09 06 07 04 00 01 1d 03 4b 2c a1 2a 02 01
0010 b7 09 01 47 30 22 a0 0a 80 08 33 04 03 92 22 25
002017 f0 a1 0b 80 00 81 00 84 01 00 86 00 85 00 83
0030  07 91 94 71 06 00 07 19
0000 09 06 07 04 00 01 00 2b 03 4b 27 a1 25 02 01
0010 00 09 01 66 30 1d a0 0a 80 08 33 04 03 92 22 25
002017 f0 a1 06 82 00 84 00 85 00 82 07 91 94 71 06
0030  00 07 19

仅凭所展示的样品,请尝试以下内容。使用GNU
awk
编写和测试

awk '
!NF{ found1=found2=prevLine=prevRestLine=0 }
/(^|[[:space:]])4b([[:space:]]|$)/{
  found1=1
  print
  next
}
found1 && /(^|[[:space:]])14([[:space:]]|$)/{
  found2=1
  prevLine=$0
  match($0,/[[:space:]]+$/)
  s=substr($0,RSTART,RLENGTH)
  sub(/[0-9]+[[:space:]]+$/,"")
  prevRestLine=$0
  next
}
found1 && found2{
  if($2==17 && prevLine && prevRestLine){
    print prevRestLine 25 s ORS $0
    prevLine=prevRestLine=0
  }
  if($2!=17 && prevLine){
    print prevLine ORS $0
    prevLine=0
  }
  found1=found2=0
  next
}
1
' Input_file
说明:添加上述内容的详细说明

awk '                                            ##Starting awk program from here.
!NF{ found1=found2=prevLine=prevRestLine=0 }     ##If line is null then reset.
/(^|[[:space:]])4b([[:space:]]|$)/{              ##if 4b is present(with spaces or without) then:
  found1=1                                       ##Set found1
  print                                          ##print current line.
  next                                           ##Leave all other statements from here.
}
found1 && /(^|[[:space:]])14([[:space:]]|$)/{    ##Checking if found1 is set AND 14 is found(with or without space)
  found2=1                                       ##Set found2 here.
  prevLine=$0                                    ##Set prevLine value to current line.
  match($0,/[[:space:]]+$/)                      ##Get ending spaces of line.
  s=substr($0,RSTART,RLENGTH)                    ##create s with above matched values.
  sub(/[0-9]+[[:space:]]+$/,"")                  ##Substitute digits spaces at last with NULL in current line.
  prevRestLine=$0                                ##Set prevRestLine value to current line.
  next                                           ##Leave all other statements from here.
}
found1 && found2{                                ##Checking if found1 and found2 are set.
  if($2==17 && prevLine && prevRestLine){        ##Checking if 2nd field is 17 and prevLine, prevRestLine are set.
    print prevRestLine 25 s ORS $0               ##Printing prevRestLine 25 s ORS $0 here.
    prevLine=prevRestLine=0                      ##unset here.
  }
  if($2!=17 && prevLine){                        ##If 2nd column is not 17 AND prevLine is set.
    print prevLine ORS $0                        ##Printing prevLine ORS and current line.
    prevLine=0                                   ##unset prevLine here.
  }
  found1=found2=0                                ##unset found1 and found2 here.
  next                                           ##Leave all other statements from here.
}
1                                                ##1 will print current line.
' Input_file                                     ##Mentioning Input_file name here.

14
是否总是在
4b
之后的下一行?
14
是否总是第二行的最后一个字段?对于第一个问题,不要总是这样。关于第二个问题,是的。我只对
14
是行的最后一个字段的情况感兴趣。在这种情况下,我认为行中有
17
字段。这样做是一个很好的选择。正在研究是否出现
4b
。如果
14
17
字段中,并且
17
在下一行的第二个字段中,那么将
14
更改为
25
@Anubhavac您能解释一下吗?是的,您也可以检查链接的deno以获得解释。请检查您问题下方的问题,并澄清错误。请检查链接的演示和我生成的响应。在第二行的最后一列中,两个都显示了
25
awk '                                            ##Starting awk program from here.
!NF{ found1=found2=prevLine=prevRestLine=0 }     ##If line is null then reset.
/(^|[[:space:]])4b([[:space:]]|$)/{              ##if 4b is present(with spaces or without) then:
  found1=1                                       ##Set found1
  print                                          ##print current line.
  next                                           ##Leave all other statements from here.
}
found1 && /(^|[[:space:]])14([[:space:]]|$)/{    ##Checking if found1 is set AND 14 is found(with or without space)
  found2=1                                       ##Set found2 here.
  prevLine=$0                                    ##Set prevLine value to current line.
  match($0,/[[:space:]]+$/)                      ##Get ending spaces of line.
  s=substr($0,RSTART,RLENGTH)                    ##create s with above matched values.
  sub(/[0-9]+[[:space:]]+$/,"")                  ##Substitute digits spaces at last with NULL in current line.
  prevRestLine=$0                                ##Set prevRestLine value to current line.
  next                                           ##Leave all other statements from here.
}
found1 && found2{                                ##Checking if found1 and found2 are set.
  if($2==17 && prevLine && prevRestLine){        ##Checking if 2nd field is 17 and prevLine, prevRestLine are set.
    print prevRestLine 25 s ORS $0               ##Printing prevRestLine 25 s ORS $0 here.
    prevLine=prevRestLine=0                      ##unset here.
  }
  if($2!=17 && prevLine){                        ##If 2nd column is not 17 AND prevLine is set.
    print prevLine ORS $0                        ##Printing prevLine ORS and current line.
    prevLine=0                                   ##unset prevLine here.
  }
  found1=found2=0                                ##unset found1 and found2 here.
  next                                           ##Leave all other statements from here.
}
1                                                ##1 will print current line.
' Input_file                                     ##Mentioning Input_file name here.