Awk While和For Loop

时间:2013-12-20 18:45:51

标签: bash awk

我有两个文件(file1和file2)

file1:

-11.61
-11.27
-10.47

file2:

NAME
NAME
NAME

我想使用awk在文件2中搜索第一次出现的NAME,并在它之前添加第一行file1,依此类推。所需的输出是

########## Energy:              -11.61
NAME
########## Energy:              -11.27
NAME
########## Energy:              -10.47
NAME

我试过这段代码

#!/bin/bash

file=file1
while IFS= read line
do
        # echo line is stored in $line
        echo $line
awk '/MOLECULE/{print "### Energy: "'$line'}1' file2` > output
done < "$file"

但这是我得到的输出

########## Energy:              -10.47
NAME
########## Energy:              -10.47
NAME
########## Energy:              -10.47
NAME

我不知道为什么脚本在file2中每次出现NAME之前只放入file1的最后一个值。

感谢您的帮助!

很抱歉,如果我不清楚我的问题。以下是我的文件样本(energy.txt和sample.mol2):

[user] $ cat energy.txt

-11.61
-11.27
-10.47

[user] $ cat sample.mol2

@<TRIPOS>MOLECULE
methane
5 4 1 0 0 
SMALL
NO_CHARGES


@<TRIPOS>ATOM
  1 C        2.8930    -0.4135    -1.3529 C.3   1 <1>   0.0000 
  2 H1       3.9830    -0.4135    -1.3529 H     1 <1>   0.0000 
  3 H2       2.5297     0.3131    -0.6262 H     1 <1>   0.0000 
  4 H3       2.5297    -1.4062    -1.0869 H     1 <1>   0.0000 
  5 H4       2.5297    -0.1476    -2.3456 H     1 <1>   0.0000 
@<TRIPOS>BOND
  1   1   2  1   
  2   1   3  1   
  3   1   4  1   
  4   1   5  1   

@<TRIPOS>MOLECULE
ammonia
4 3 1 0 0 
SMALL
NO_CHARGES


@<TRIPOS>ATOM
  1 N        8.6225    -3.5397    -1.3529 N.3   1 <1>   0.0000 
  2 H1       9.6325    -3.5397    -1.3529 H     1 <1>   0.0000 
  3 H2       8.2858    -2.8663    -0.6796 H     1 <1>   0.0000 
  4 H3       8.2858    -4.4595    -1.1065 H     1 <1>   0.0000 
@<TRIPOS>BOND
  1   1   2  1   
  2   1   3  1   
  3   1   4  1   

@<TRIPOS>MOLECULE
water
3 2 1 0 0 
SMALL
NO_CHARGES


@<TRIPOS>ATOM
  1 O        7.1376     3.8455    -3.4206 O.3   1 <1>   0.0000 
  2 H1       8.0976     3.8455    -3.4206 H     1 <1>   0.0000 
  3 H2       6.8473     4.4926    -2.7736 H     1 <1>   0.0000 
@<TRIPOS>BOND
  1   1   2  1   
  2   1   3  1

这是我需要的输出

########## Energy:              -11.61
@<TRIPOS>MOLECULE
methane
5 4 1 0 0 
SMALL
NO_CHARGES


@<TRIPOS>ATOM
  1 C        2.8930    -0.4135    -1.3529 C.3   1 <1>   0.0000 
  2 H1       3.9830    -0.4135    -1.3529 H     1 <1>   0.0000 
  3 H2       2.5297     0.3131    -0.6262 H     1 <1>   0.0000 
  4 H3       2.5297    -1.4062    -1.0869 H     1 <1>   0.0000 
  5 H4       2.5297    -0.1476    -2.3456 H     1 <1>   0.0000 
@<TRIPOS>BOND
  1   1   2  1   
  2   1   3  1   
  3   1   4  1   
  4   1   5  1   
########## Energy:              -11.27
@<TRIPOS>MOLECULE
ammonia
4 3 1 0 0 
SMALL
NO_CHARGES


@<TRIPOS>ATOM
  1 N        8.6225    -3.5397    -1.3529 N.3   1 <1>   0.0000 
  2 H1       9.6325    -3.5397    -1.3529 H     1 <1>   0.0000 
  3 H2       8.2858    -2.8663    -0.6796 H     1 <1>   0.0000 
  4 H3       8.2858    -4.4595    -1.1065 H     1 <1>   0.0000 
@<TRIPOS>BOND
  1   1   2  1   
  2   1   3  1   
  3   1   4  1   
########## Energy:              -10.47
@<TRIPOS>MOLECULE
water
3 2 1 0 0 
SMALL
NO_CHARGES


@<TRIPOS>ATOM
  1 O        7.1376     3.8455    -3.4206 O.3   1 <1>   0.0000 
  2 H1       8.0976     3.8455    -3.4206 H     1 <1>   0.0000 
  3 H2       6.8473     4.4926    -2.7736 H     1 <1>   0.0000 
@<TRIPOS>BOND
  1   1   2  1   
  2   1   3  1

2 个答案:

答案 0 :(得分:3)

paste -d "\n" <(sed 's/^/########## Energy:              /' file1) file2
########## Energy:              -11.61
NAME
########## Energy:              -11.27
NAME
########## Energy:              -10.47
NAME

或者,坚持使用awk

awk '{
    print "########## Energy:              " $0
    getline < "file2"
    print
}' file1

答案 1 :(得分:0)

使用awk:

awk 'NR==FNR{a[NR]=$0;next} /@<TRIPOS>MOLECULE/
    {print "########## Energy:             ", a[++i]}1' energy.txt sample.mol2

说明:

  • FNR - 当前文件的行号
  • NR - 两个文件总行数。
  • NR==FNR{a[NR]=$0;next}适用于第一个energy.txt
  • 所以上面的语句填充索引为1,2,3...且值为$0的数组
  • /@<TRIPOS>MOLECULE/搜索在第二个文件sample.mol2
  • 上执行
  • 当上面的搜索成功时,它会打印引用的静态字符串和从第一个文件
  • 创建的数组中的一行
  • ++i将计数器移动到打印后的数组中的下一个元素
相关问题