在目录〜/ main1 / sub1,〜/ main1 / sub2,〜/ main1 / sub3,...,〜/ main2 / sub1,〜/ main2 / sub2,...〜/ mainX中,有几个名为TESTFILE的文件/ subY其中mainX是主文件夹,subY是主文件夹内的子文件夹。每个主文件夹子文件夹的TESTFILE文件都具有相同的模式,但是每个文件中的数据都是唯一的。
现在,这就是我想要做的:
我想在每个〜/ mainX / subY的TESTFILE中读取一个特定的数字。
我想创建一个文本文件,其中每一行的格式如下:[mainX] [space] [subY] [space] [从TESTFILE读取的值]
有关TESTFILE和我想获取的数据的一些信息:
DAV:2 -0.942521930239E + 01 0.27889E-09 -0.79991E-13 864 0.312E-06
10 F = -.94252193E + 01 E0 = -.94252193E + 01 d E = -.717252E-07
或者通常,最后两行模式是:
DAV:一个BCDEF
克 F = ħ E0 = 我 D E = Ĵ
斜体部分是不变的部分,黑体字变量是我想要的部分
有关主文件夹mainX和子文件夹subY的一些信息:
我想要的输出是:
假设mainX = {0.12,0.20,0.34,0.7}和subY = {1.10,2.30,4.50,1.00,2.78},〜/ 0.12 / 1.10 / OSZICAR的最后两行是上面的示例,我的输出文件应包含:
0.12 1.10 2 10 -.94252193E+01 -.94252193E+01 -.717252E-07
...
0.7 2.30 2 10 -.94252193E+01 -.94252193E+01 -.717252E-07
...
mainX mainY a g h i j
如何以最简单的方式做到这一点?我正在阅读grep,awk,sed,我非常不知所措。
您可以使用for
bash中的一些循环来执行此操作:
for m in ~/main*/; do
main=$(basename "$m")
for s in "$m"sub*/; do
sub=$(basename "$s")
num=$(tail -n2 TESTFILE | awk -F'[ =]+' 'NR==1{s=$2;next}{print s,$1,$3,$5,$8}')
echo "$main $sub $num"
done
done > output_file
我已经修改了从文件中提取数据的命令。它用于tail
读取文件的最后两行。这些行将传递到awk
,在此处使用任意数量的空格和=
符号一起作为字段分隔符将它们分成多个字段。两行第一行中的第二个字段保存到变量中s
。next
跳到下一行,然后打印您感兴趣的列。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句