把awk命令放到一个单独的文件中

时间:2014-11-25 19:21:50

标签: bash awk terminal

我确实制作了一个代码,现在想创建一个单独的文件,因为代码有点长,但我遇到了麻烦。

这是我的代码:

awk 'NF && $1!~/^@/ && $1!~/^#/' rmsd.xvg | awk '{for(i=1;i<=NF;i++) {sum[i] += $i; sumsq[i] += ($i)^2}} 
      END {for (i=2;i<=NF;i++) {
      print "\n", sum[i]/NR, sqrt((sumsq[i]-sum[i]^2/NR)/NR)}}' | sort -u

如何做到这一点?

3 个答案:

答案 0 :(得分:1)

创建一个名为script.awk的文件,并输入:

{ for(i=1;i<=NF;i++) {
    sum[i] += $i; sumsq[i] += ($i)^2}
} 
END {for (i=2;i<=NF;i++) {
    print "\n", sum[i]/NR, sqrt((sumsq[i]-sum[i]^2/NR)/NR)
    }
}
进入它。然后使用:

awk 'NF && $1!~/^@/ && $1!~/^#/' rmsd.xvg | awk -f script.awk | sort -u

但是不需要两个单独的awk命令。将脚本更改为:

/^[@#]/ { for(i=1;i<=NF;i++) {
    sum[i] += $i; sumsq[i] += ($i)^2}
} 
END {for (i=2;i<=NF;i++) {
    print "\n", sum[i]/NR, sqrt((sumsq[i]-sum[i]^2/NR)/NR)
    }
}

然后:

awk -f script.awk rmsd.xvg | sort -u

答案 1 :(得分:0)

您可以创建一个shell脚本

#!/bin/bash
awk 'NF && $1!~/^@/ && $1!~/^#/' rmsd.xvg | awk '{for(i=1;i<=NF;i++) {sum[i] += $i; sumsq[i] += ($i)^2}} 
      END {for (i=2;i<=NF;i++) {
      print "\n", sum[i]/NR, sqrt((sumsq[i]-sum[i]^2/NR)/NR)}}' | sort -u

执行脚本

$ bash fileName

答案 2 :(得分:0)

请注意,您有两个 awk命令。然而,第一个只是一个过滤器,可以简单地与第二个组合。唯一的问题是,您不需要在NR操作中使用END,而是需要记录第一个操作对记录执行的记录数。结合的两个脚本以及NR的调整看起来像

NF && $1 !~ /^@/ && $1 !~ /^#/ {
    for(i=1;i<=NF;i++) {
        sum[i] += $i
        sumsq[i] += ($i)^2
    }
    record_count++
} 
END {
    for (i=2;i<=NF;i++) {
        print "\n", sum[i]/record_count, sqrt((sumsq[i]-sum[i]^2/record_count)/record_count)
    }
}

我假设每一行都有相同数量的字段;否则,NF操作中END的值只是最后一行NF的值,可能有也可能没有任何意义。

将上述内容保存在script.awk之后,请使用

运行
awk -f script.awk rmsd.xvg | sort -u