使用awk从一个文件中抓取数据并将其发送到另一个文件
Grabbing data from one file and sending it to another file using awk
我有一个 jupyter notebook 运行ning 在一个包含一堆输出文件的目录中。
该目录有一堆 .out
文件,我想 运行 awk 以从中提取一些信息。
这是 bash 大部分有效的脚本:
for file in *.out
do awk '/SCF TOTAL ENERGY/ {print $NF; exit}' $file >> data.txt
done
这从每个输出文件中获取 SCF 总能量,将它们打印出来,然后将它们放入 data.txt
。
但是,这不是我想要从输出文件中获得的唯一信息。
假设我有另一条名为“有用”的信息。
我想获取与“USEFUL”(也在 NF 位置)关联的数字,在 data.txt
中创建一个新列并用 USEFUL
数据填充该列。
我知道我可以使用
在 data.txt
中创建一个新列
awk 'BEGIN{FS=OFS=" "}
{print [=11=] OFS }' data.txt
但是,我不知道如何从一个文件中提取信息,并将其发送到data.txt
,同时制作一个新的专栏。
输入 files 看起来像这样:
first.out
SCF TOTAL ENERGY ----> 1234
lorem
ipsum
text
here
more
text
USEFUL ---> 4567
second.out
CF TOTAL ENERGY ----> 4321
lorem
ipsum
text
here
more
text
USEFUL ---> 7654
third.out:
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 TOTAL ENERGY
和 USEFUL
然后添加 nextfile
在 scfVal=""
行之后可以更快地处理它(它需要 GNU awk
)。
我有一个 jupyter notebook 运行ning 在一个包含一堆输出文件的目录中。
该目录有一堆 .out
文件,我想 运行 awk 以从中提取一些信息。
这是 bash 大部分有效的脚本:
for file in *.out
do awk '/SCF TOTAL ENERGY/ {print $NF; exit}' $file >> data.txt
done
这从每个输出文件中获取 SCF 总能量,将它们打印出来,然后将它们放入 data.txt
。
但是,这不是我想要从输出文件中获得的唯一信息。
假设我有另一条名为“有用”的信息。
我想获取与“USEFUL”(也在 NF 位置)关联的数字,在 data.txt
中创建一个新列并用 USEFUL
数据填充该列。
我知道我可以使用
在data.txt
中创建一个新列
awk 'BEGIN{FS=OFS=" "}
{print [=11=] OFS }' data.txt
但是,我不知道如何从一个文件中提取信息,并将其发送到data.txt
,同时制作一个新的专栏。
输入 files 看起来像这样: first.out
SCF TOTAL ENERGY ----> 1234
lorem
ipsum
text
here
more
text
USEFUL ---> 4567
second.out
CF TOTAL ENERGY ----> 4321
lorem
ipsum
text
here
more
text
USEFUL ---> 7654
third.out:
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 TOTAL ENERGY
和 USEFUL
然后添加 nextfile
在 scfVal=""
行之后可以更快地处理它(它需要 GNU awk
)。