如何使用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将包含特定字符串的行之后的行的第三列中的值打印到不同的文件?的主要内容,如果未能解决你的问题,请参考以下文章