使用awk从多个文件中提取数据的问题

时间:2014-04-25 16:56:18

标签: bash for-loop awk

如果我有300个文件:

f_1.dat,f_2.dat,......,f_300.dat

例如,文件 f_114.dat 具有类似

的结构

原子(指数):

114

Ave:cosp1 cosp2 cosp3:

-0.74 -0.54 -0.37

...

我想从某些文件中提取第二行(例如,数字114)和第四行(三个数字)(这些文件是 f_114.dat,f_182.dat,...,f_249。 300个文件中的dat )并将它们合并到同一个文件中,例如:

114 -0.74 -0.54 -0.37

182 -0.72 -0.59 -0.37

...

我试过结构,命令是

for i in `114,182,251,131,183,257,140,191,31,148,192,48,151,195,51,92,177,249`; do awk -v num=$i 'NR=2&&NR=4{print $0}' f_$i.dat > $i.dat; done

但错误表明存在语法错误。 你能解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我想你想要这样的东西:

for i in {114,182,251,131,183,257,140,191,31,148,192,48,151,195,51,92,177,249} ; do 
  awk 'BEGIN {ORS=" "} NR==2 || NR==4' f_$i.dat
  echo "" 
done > merged-file.dat

你的for-loop

存在一些问题
    for循环中缺少
  1. do;
    for循环的结构类似于for i in $LIST ; do ... ; done
  2. $LIST部分无效

  3. 由于-v num=$i表达式中未使用num变量,因此不需要
  4. awk
  5. 您想要将输出合并到同一个文件中,因此将> $i.dat放在for循环中将无效,因为它们输出到单独的文件;
    • 您需要将> $OUTFILE.dat置于for-loop
    • 之外
    • 将for循环的每次迭代的输出附加(>>)到同一个文件中,例如:for i in ... ; do ... >> OUTFILE.dat ; done