我有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
感谢您的帮助!
答案 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
。