1

我有 100 个文本文件,如下所示:

File title
4
Realization number
variable 2 name
variable 3 name
variable 4 name
1   3452  4538   325.5

第 7 行 (1) 的第一个数字是实现编号,它应该与文件名相关。即第一个文件称为file1.txt,实现编号为1(如上所示)。第二个文件名为 file2.txt,第 7 行的实现编号为 2。file3.txt 应该在第 7 行具有实现编号 3,依此类推...

不幸的是,每个文件的实现=1,它们应该根据文件名递增。

我想从每个文件的第 7 行(3452、4538 和 325.5)中提取变量 2、3 和 4,并将它们附加到一个名为 summary.txt 的摘要文件中。

我知道如何从 1 个文件中提取信息:

awk 'NR==7,NR==7{print $2, $3, $4}' file1.txt

其中,正确地给了我:

3452 4538 325.5

我的第一个问题是,当从多个文件的 bash 脚本运行时,此命令似乎没有给出相同的结果。

#!/bin/bash    
for ((i=1;i<=100;i++));do
    awk 'NR=7,NR==7{print $2, $3, $4}' File$((i)).txt
done

当我使用上述脚本时,我会在屏幕上打印多行。

其次,我想将这些值与正确的先前实现编号一起输出到摘要文件中。即我想要一个看起来像这样的文件:

1  3452  4538  325.5
2  4582  6853  158.2
...
100  4865 3589  15.15

谢谢你的帮助!

4

3 回答 3

3

您可以简化一些事情并获得您想要的结果:

#!/bin/bash    

for ((i=1;i<=100;i++))
do
    echo $i $(awk 'NR==7{print $2, $3, $4}' File$i.txt)
done

您真的不想分配给 NR=7 (就像您所做的那样),您也不需要重复NR==7,NR==7。当足够时你也真的不需要$((i))符号。$i

如果所有文件的长度正好为 7 行,则可以在一个awk命令中完成所有操作(而不是 100 个):

awk 'NR%7==0 { print ++i, $2, $3, $4}' Files*.txt
于 2012-12-12T00:28:02.577 回答
1

请注意,您的 bash 脚本中只有一个=。所有文件都正好有 7 行吗?如果您只对第 7 行感兴趣,那么:

#!/bin/bash    
for ((i=1;i<=100;i++));do
    awk 'NR==7{print $2, $3, $4}' File$((i)).txt
done

由于您的实现编号从 1 开始,您可以使用nl命令简单地添加它。

例如,如果您的 bash 脚本被调用,s.sh那么:

./s.sh | nl > summary.txt

将为您提供包含预期行的结果summary.txt

于 2012-12-12T00:27:55.840 回答
0

这是一种使用方法awk

awk 'FNR==7 { print ++i, $2, $3, $4 > "summary.txt" }' $(ls -v file*)

-v标志只是按版本号对 glob 进行排序。如果您的版本ls不支持此标志,请尝试:ls file* | sort -V代替。

于 2012-12-12T00:51:49.507 回答