gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:42:50 25 4
gpt4 key购买 nike

我正在尝试以 txt 格式查找字符串,每次找到它时都会查找特定字符串以更改为另一个字符串并避免读取该行的第一个序列。
想象一下接下来的十六进制txt:

0000  09 06 07 04 00 00 01 00 1d 03 4b 2c a1 2a 02 01   
0010 b7 09 01 47 30 22 a0 0a 80 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 1d 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 4b 2c a1 2a 02 01   
0010 b7 09 01 47 30 22 a0 0a 80 08 33 04 03 92 22 14
0020 12 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 1d a0 0a 80 08 33 04 03 92 22 14
0020 12 f0 a1 06 82 00 84 00 85 00 82 07 91 94 71 06
0030 00 07 19
每次遇到 4b 序列时我都需要它来查找 14 个序列,如果找到,则在下一行查找第一个字符串,在本例中为 17,如果此字符串为 17,则更改为 12。左侧是一个序列,它为您提供您所在的 txt 行,因此分析起来并不有趣,因为它在每个段落中重复
我所拥有的是下一个:
gawk  ' { for ( i = 1; i <= NF; ++i ) {

if ( $i == "4b" )
r = 1
if ( r && ($i == "14" ))
t = 1
if ( r && t && $i == "17") {
r = 0
t = 0
$i = "12"

}
}
}
1 ' example.txt example2.txt
但是,我不太清楚如何避免读取每行的第一个 xxxx 序列

最佳答案

就像在生活中一样,在处理数据时,根据过去发生的事情(您已阅读的数据)而不是将来会发生的事情(您将要阅读的数据)做出决定要容易得多,因此不要说“如果我有 X 和它之后的东西是 Y” 将您的要求写为“如果我有 Y 和它之前的东西是 X”,并且实现它的软件通常变得更加简单和明显。
这是您要执行的操作吗(在每个 Unix 机器上的任何 shell 中使用任何 awk):

$ cat tst.awk
($2 == 17) && (p1 ~ / 14 /) && (p2 ~ / 4b /) {
sub(/ 17 /," 12 ")
}
{ p2=p1; p1=$0" "; print }
$ awk -f tst.awk file
0000 09 06 07 04 00 00 01 00 1d 03 4b 2c a1 2a 02 01
0010 b7 09 01 47 30 22 a0 0a 80 08 33 04 03 92 22 14
0020 12 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 1d a0 0a 80 08 33 04 03 92 22 14
0020 12 f0 a1 06 82 00 84 00 85 00 82 07 91 94 71 06
0030 00 07 19
如果这不是您所需要的全部,那么编辑您的问题以阐明您的要求并提供更真正全面的示例输入/输出,包括上述方法不适用的情况。
我正在使用 sub(/ 17 /," 12 ")上面而不是 $2=12保留字段之间的空白。这样做是安全的,因为目标字段是 2 美元,如果它是任何其他字段,则在目标字段也可能是 17 之前,您不能将其作为字段执行。有各种 sub()/match()/substr()处理方法当然。

关于AWK 搜索特定序列,如果找到,则在下一行搜索另一个序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66242179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com