使用行数中的值更新最后一个字段(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?)的主要内容,如果未能解决你的问题,请参考以下文章