我确实制作了一个代码,现在想创建一个单独的文件,因为代码有点长,但我遇到了麻烦。
这是我的代码:
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
如何做到这一点?
答案 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