打印文件的最后一行并使用 awk 附加一个值

print last line of a file and append a value using awk

我有一个 python 脚本,它以两列的形式将数据 x 和 y 输出到文件 averages.dat

我正在尝试使用 awk 获取 averages.dat 的最后一行,在新的第 3 列中添加一个值,然后将其附加到文件 averages2.dat.

我一直在尝试 awk END{print} averages.dat 获取最后一行并且

awk '{print [=14=], value}' averages.dat 将值附加到第三列的末尾。

这两个单独使用都很好,但我试过将它们组合使用都无济于事。我知道我需要在最后使用 >> averages2.dat 来附加到新文件。

关于合并这两个 awk 命令有什么建议吗?还是有比 END{print} 更好的获取最后一行的方法?因为我觉得这可能是问题所在。

您可以使用 sed:

sed -i.bak -n '$s/.*/& value/p' file

解释:

  • -i.bak - 使用内联编辑并使用 .bak 扩展名保存原始文件
  • -n - 禁止打印
  • $s - 仅替换最后一行
  • .* - 匹配整行
  • & value - 在替换中使用完整行,后跟 space 和文字 "value"
  • p - 打印替换行

简单

awk 'END { print [=10=], value }' averages.dat >> averages2.dat

END要理解为后面的block执行的条件;因此,如果已到达输入末尾,则执行 print [=13=], value 。只有在处理最后一条记录时才会出现这种情况。

要在脚本中使用 shell 变量,写

awk -v density="$DENSITY" 'END { print [=11=], density }' averages.dat >> averages2.dat

这会在 awk 代码开始 运行.

之前将 awk 变量 density 设置为 $DENSITY 的值

在这种情况下,awk 比 sed 更健壮,因为使用 sed 您必须将变量直接替换到代码中(例如 "s/.*/& $DENSITY/")。然后 sed 最终会将其解释为代码,而不是数据,这意味着如果它包含对 sed 具有特殊含义的字符(例如 &),sed 将出错或做一些奇怪的事情。 Awk 可以使用上面的调用毫无问题地处理这个问题。