Shell 使用awk从一个文件中获取数据并将其发送到另一个文件

Shell 使用awk从一个文件中获取数据并将其发送到另一个文件,shell,awk,text,text-processing,Shell,Awk,Text,Text Processing,我有一个jupyter笔记本,运行在一个目录中,有一堆输出文件。 目录中有一堆.out文件,我想对它们运行awk以从中提取一些信息 在大多数情况下,这是一个bash脚本: for file in *.out do awk '/SCF TOTAL ENERGY/ {print $NF; exit}' $file >> data.txt done 这将从每个输出文件中获取SCF总能量,将其打印出来,并将其放入data.txt 但是,这不是我想要从输出文件中获得的唯一信息 假设我有另一条

我有一个jupyter笔记本,运行在一个目录中,有一堆输出文件。 目录中有一堆
.out
文件,我想对它们运行awk以从中提取一些信息

在大多数情况下,这是一个bash脚本:

for file in *.out
do awk '/SCF TOTAL ENERGY/ {print $NF; exit}' $file >> data.txt
done
这将从每个输出文件中获取SCF总能量,将其打印出来,并将其放入
data.txt

但是,这不是我想要从输出文件中获得的唯一信息

假设我有另一条叫做“有用”的信息。 我想获取与“有用”相关联的数字(也在NF位置),在
data.txt
中创建一个新列,并用
有用的
数据填充该列

我知道我可以使用

awk 'BEGIN{FS=OFS="  "} 
{print $0 OFS }' data.txt
但是,我不知道如何从一个文件中提取信息,并将其发送到
data.txt
,同时创建一个新列

输入文件s如下所示: 先出

SCF TOTAL ENERGY ----> 1234
lorem
ipsum
text
here
more 
text
USEFUL ---> 4567 
第二名

CF TOTAL ENERGY ----> 4321
lorem
ipsum
text
here
more 
text
USEFUL ---> 7654 
第三点:

CF TOTAL ENERGY ----> 5566
lorem
ipsum
text
here
more 
text
USEFUL ---> 8877 
我希望我的
data.txt
或最终数据文件如下所示:

1234  4567   
4321  7654
5566  8877
其中第一列为SCF总能量,第二列有用

目前,我只有第一栏。我想创建一个代码,在这里我可以不断从输入文件中提取信息并不断添加列


感谢您的任何建议

请您尝试使用GNU
awk
中显示的样本编写并测试以下内容。我们不需要使用
for
循环遍历所有
.out
文件,您可以通过
awk
程序本身读取所有
.out
文件

awk '/SCF TOTAL ENERGY/{scfVal=$NF;next} /USEFUL/{print scfVal,$NF;scfVal=""}' *.out
说明:添加上述内容的详细说明

awk '                  ##Starting awk program from here.
/SCF TOTAL ENERGY/{    ##Checking condition if line has SCF TOTAL ENERGY then do following.
  scfVal=$NF           ##Setting scfVal value to last field of current line here.
  next                 ##next will skip all further statements from here.
}
/USEFUL/{              ##Checking if line contains USEFUL then do following.
  print scfVal,$NF     ##Printing scfVal and last field value here.
  scfVal=""            ##Nullify scfVal here.
}
' *.out                ##Passing all .out files to awk program from here.

注意:如果您只有一组
SCF总能量
有用的
,那么在
scfVal=“”
行之后添加
nextfile
,以加快处理速度(需要GNU
awk
)。

您可以尝试以下内容,用GNU
awk
中显示的样本编写和测试吗。我们不需要使用
for
循环遍历所有
.out
文件,您可以通过
awk
程序本身读取所有
.out
文件

awk '/SCF TOTAL ENERGY/{scfVal=$NF;next} /USEFUL/{print scfVal,$NF;scfVal=""}' *.out
说明:添加上述内容的详细说明

awk '                  ##Starting awk program from here.
/SCF TOTAL ENERGY/{    ##Checking condition if line has SCF TOTAL ENERGY then do following.
  scfVal=$NF           ##Setting scfVal value to last field of current line here.
  next                 ##next will skip all further statements from here.
}
/USEFUL/{              ##Checking if line contains USEFUL then do following.
  print scfVal,$NF     ##Printing scfVal and last field value here.
  scfVal=""            ##Nullify scfVal here.
}
' *.out                ##Passing all .out files to awk program from here.

注意:如果您只有一套
SCF总能量
有用的
,请在
scfVal=”“
行之后添加
nextfile
,以加快处理速度(需要GNU
awk
)。

感谢您在您的问题中添加您的努力,为了更好地理解您的问题,请您在问题中发布输入和预期输出的示例,谢谢。好的,我会尽快制作文件。谢谢@ravindersingh13我已经添加了一些附加信息。希望它能帮助@ravindersingh13感谢添加样本。请告诉我们行
-512.327909892086 29
是如何输出的,很抱歉,它不清楚。哦,因为我只有输入文件的示例,所以我在输出文件中发布了示例编号。我可以编辑。谢谢你在问题中添加你的努力,请你在问题中发布输入和预期输出的示例,以便更好地理解你的问题,谢谢。好的,我很快会制作文件。谢谢@ravindersingh13我已经添加了一些附加信息。希望它能帮助@ravindersingh13感谢添加样本。请告诉我们行
-512.327909892086 29
是如何输出的,很抱歉,它不清楚。哦,因为我只有输入文件的示例,所以我在输出文件中发布了示例编号。我可以编辑。