使用重复模式对文件部分中的行进行编号

Numbering lines in sections of file with repeating pattern

我正在尝试使用 awk 在较大的文件中使用 scan-hgi-oi.[0-9][0-9][0-9].out4 模式对重复行进行编号

我关闭成功的是以下命令

awk 'BEGIN{i=0}{if (="scan-hgi-oi.[0-9][0-9][0-9].out4") { i=i+1}   printf"%i\n","%f",i,}' test2 > test3

这似乎只是用数字 0 替换每一行

我之所以想用awk而不是sed来解决这个问题是因为每个部分的模式重复次数不同。

该文件包含如下部分:

xxxxxxx\
yyyyyyy\
zzzzzz\
scan-hgi-oi.001.out4 number\
scan-hgi-oi.001.out4 number\
scan-hgi-oi.001.out4 number\
ppppppp
xxxxxx\
yyyyyyy\
zzzzzzz\
scan-hgi-oi.002.out4 number\
scan-hgi-oi.002.out4 number\
scan-hgi-oi.002.out4 number\
scan-hgi-oi.002.out4 number\
ppppppp

我想得到下面的结果。

xxxxxx\
yyyyyyy\
zzzzzzz\
1 number\
2 number\
3 number\
ppppppp
xxxxxx\
yyyyyyy\
zzzzzzz\
1 number\
2 number\
3 number\
4 number\
ppppppp

希望能帮到你。

Svend 致以诚挚的问候

当前 awk 代码的问题:

  • ="scan-hgi-oi.[0-9][0-9][0-9].out4"是赋值(单=);对于测试,您需要使用双 = (=="scan....")(尽管还需要修改代码以处理尾随 \
  • if (="scan ...")(赋值,而不是测试)总是评估为 'false'(在这种情况下),因此永远不会执行 i=i+1(即,i 将始终是 =0)
  • printf "%i\n","%f",i, - 格式字符串 ("%i\n") 只有一个占位符,所以只有 3 个参数 ("%f", i, </code>)使用了 <code>"%f" 并且由于字符串 "%f" 是无效的 integer %i 最终在所有调用中被替换为 0 ...
  • 因此所有输出行都是0
  • 虽然修复了 printf 调用是可行的,但需要更多代码来解决当前行与替换行的条件打印

修改当前代码的一个想法:

$ awk '/scan-hgi-oi.[0-9]{3}.out4/ {print ++i,"number\"; next} {i=0; print}' sample.dat
xxxxxxx\
yyyyyyy\
zzzzzz\
1 number\
2 number\
3 number\
ppppppp
xxxxxx\
yyyyyyy\
zzzzzzz\
1 number\
2 number\
3 number\
4 number\
ppppppp