使用行数中的值更新最后一个字段(awk?)

Posted

技术标签:

【中文标题】使用行数中的值更新最后一个字段(awk?)【英文标题】:Update last field with value from line count (awk?) 【发布时间】:2014-03-21 04:18:06 【问题描述】:

我有一个管道分隔文件(file.001),如下所示:

00|FIELD10|FIELD02
01|FIELD01|FIELD02|FIELD03
01|FIELD01|FIELD02|FIELD03
01|FIELD01|FIELD02|FIELD03
01|FIELD01|FIELD02|FIELD03
99|4

以“01”开头的行是记录(00 = 标题,99 = 尾)。预告片中的最后一个字段(当前填充“4”)是记录数,但该记录数并不总是准确的。

我想要做的是计算记录数并更新记录计数字段,同时保持其余数据不变(打印到新文件会很好,理想情况下它会在同一个文件中)。我对此的解释是将计数值打印到最后一个字段值中,但我不知道该怎么做。

我一直在尝试使用 awk 进行此操作,目前有以下用于打印计数和最后一个字段:

打印记录数:

awk '/^01/ count++ END print count ' file.001

打印最后一个字段:

awk 'BEGIN RS="|"; END print ($(NF))' file.001

有人可以就如何做到这一点提出建议吗? 如果到目前为止我上面的内容不是很好,我是 awk 的新手,所以很抱歉。我也愿意使用 awk 以外的东西来实现这一点。

【问题讨论】:

嗯,你能指出你想要的输出是什么吗? 输出将是文件现在的样子。我遇到的问题是我可能在文件中有 1000 条“01”记录,但底部的文件数可能是“4”。我想计算这 1000 条记录并将“4”更新为“1000”。 Obvioulsy 这可以通过计数来完成,然后手动更新文件,但我一次可以有 100 个文件 【参考方案1】:

鉴于您的第一个 awk 声明,我很惊讶您没有使用这样的东西来打印最后一个字段(记录数):

awk -F '|' '/^99/  print $NF ' file

“预告片”总是以“99”开头,对吗?因此,您可以使用它对文件进行所需的更改。不妨试试以下方法:

awk 'BEGIN  OFS=FS="|"  $1 == "01"  c++  $1 == "99"  $2 = c 1' file


如果您有最新的gawk,则可以使用“就地”编辑:

gawk -i inplace '...' file

请注意,这与以下内容相同:

gawk '...' file > file.tmp && mv file.tmp file

【讨论】:

非常感谢,效果很好 :) 就像我说我是 awk 的新手,所以我有一种快要接近的感觉,但我不确定该怎么做。再次感谢:)

以上是关于使用行数中的值更新最后一个字段(awk?)的主要内容,如果未能解决你的问题,请参考以下文章

awk

如何显示行数为 1 或更多的行数中的所有记录?

NF$NFFRFNR举例说明

Gravity Forms使用JS统计List中的行数并返回字段?

使用awk按照行数切割文件

shell脚本,awk利用NF来计算文本显示的行数。