【发布时间】:2021-05-20 15:44:09
【问题描述】:
我正在尝试查找一个 txt 格式的字符串,每次找到它时,然后寻找一个特定的字符串来更改另一个字符串,并避免读取该行的第一个序列。
想象下一个十六进制 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
我不知道如何跳转开始阅读下一行
总结:
这个想法是搜索4b,如果遇到,然后开始在同一行中寻找14,它必须在该行的最后一个位置。 如果在下一行的第二个字段中出现 17 然后将 14 更改为 25
我拥有的是这样的:
gawk -i inplace ' { for ( i = 1; i <= NF; ++i ) {
if ($i == "4b" )
r = 1
if (r && $i == "14" )
z = 1
$i = x
if ( z && r && $i == "17")
z = 0
r = 0
x = "25"
}
}
1 ' example.txt example2.txt
主要问题是我不知道如何验证14是否是下一行的第二个字段
【问题讨论】:
-
14是否总是在4b之后的下一行?14是否总是第二行的最后一个字段? -
第一个问题,不要总是这样。关于第二个问题,是的。我只对研究
14是最后一个字段的情况感兴趣。在这种情况下,我认为该行中有17字段。通过这种方式进行操作将是一个不错的选择。正在研究是否出现4b。如果14在17字段中并且17在下一行的第二个字段中,则将14更改为25@anubhava
标签: awk