使用awk从文本文件中提取值

时间:2012-12-12 00:11:50

标签: bash unix awk

我有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

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

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

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

感谢您的帮助!

3 个答案:

答案 0 :(得分: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。 <{1}}就足够了,你也真的不需要$((i))符号。

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

awk

答案 1 :(得分: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

中找到预期行的结果

答案 2 :(得分:0)

这是使用awk的一种方式:

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

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