如何使用AWK将包含特定字符串的行之后的行的第三列中的值打印到不同的文件?

Posted

技术标签:

【中文标题】如何使用AWK将包含特定字符串的行之后的行的第三列中的值打印到不同的文件?【英文标题】:How to print the value in third column of a line which comes after a line which, contains a specific string using AWK to a different file? 【发布时间】:2021-10-31 07:16:17 【问题描述】:

我有一个输出,中间包含类似这样的内容。

  Stopping criterion = max iterations
  Energy initial, next-to-last, final = 
        -83909.5503696     -86748.8150981     -86748.8512012

我想要做的是将包含字符串“Energy”的行之后的最后一个值(第 3 列)打印到另一个文件。我必须从 100 个不同的文件中打印出这些值。目前我一直在尝试使用仅查看单个文件的这一行。

awk -F: '/Energy/  getline; print $0 ' inputfile > outputfile

但这会给出如下输出:

       -83909.5503696     -86748.8150981     -86748.8512012

更新 - 在下面的建议的帮助下,我能够将值输出到文件中。但是当它读取不同的文件时,它会覆盖最终输出文件并打印出它读取的最终文件的值。我尝试的是这个,

#SBATCH --array=1-100

num=$SLURM_ARRAY_TASK_ID..
fold=$(printf '%03d' $num)

cd $main_path/surf_$fold
awk 'fprint $3; f=0 /Energy/f=1' inputfile > outputfile

【问题讨论】:

我只需要第三个值,我要做的是读取 100 个具有相似输出的不同文件,并且从所有这 100 个不同的文件中,我只希望将特定值打印在另一个下方。 你试过什么?不要将代码或输入/输出或需求放在可能遗漏且无法格式化的 cmets 中。 edit您的问题表明您尝试了哪些导致您描述的问题,以便我们可以最好地帮助您。听起来您正在寻求处理多个输入文件的解决方案的帮助,因此您应该在问题中显示至少 2 或 3 个输入文件以及给定输入的预期输出。我们需要您提供一个minimal reproducible example,我们可以复制/粘贴它来测试潜在的解决方案。 对不起,我试图把代码放在这里,但我很难,我会​​更新问题本身 对不起,我对 awk 命令很陌生。我更新了我的问题,希望现在我在做什么很清楚。 你说得对,我会寻找更好的方法(我不会使用我喜欢的当前方法)。我可能/不记得每次运行脚本时清除该输出。谢谢大家的建议。 【参考方案1】:

这不是 getline 的合适工作,请参阅 http://awk.freeshell.org/AllAboutGetline 和 idk,当您的字段按照 awk 默认情况下采用空格分隔时,为什么要将 FS 设置为 :-F:

以下是我认为您尝试通过 1 次调用 awk 来执行的操作:

awk 'fprint $3; f=0 /Energy/f=1' "$main_path/surf_"*"/inputfile > outputfile

【讨论】:

以上是关于如何使用AWK将包含特定字符串的行之后的行的第三列中的值打印到不同的文件?的主要内容,如果未能解决你的问题,请参考以下文章

删除不包含特定字符串的行的百分比

如何查询仅出现特定列中具有最高值的行的行?

根据包含数字和不包含数字的行对 CSV 中的行进行排序

在 txt 文件中的不同列中取两个特定值之间的行 [关闭]

如何显示要编辑的特定行的注释?

如何使用 node.js 和 Promises 将特定行的行添加到文件的内容