下面的文件名为ABCD.vasp
# A B C D
1.000000
13.85640621 0.00000000 0.00000000
4.61880236 13.06394496 0.00000000
0.00000000 0.00000000 45.25483322
A B C D
32 32 32 32
Selective dynamics
Direct
0.00000000 0.00000000 0.00000000 F F F
0.00000000 0.00000000 0.12500000 F F T
0.00000000 0.00000000 0.25000000 F F T
0.00000000 0.00000000 0.37500000 F F T
0.50000000 0.00000000 0.00000000 F F F
0.50000000 0.00000000 0.12500000 F F T
0.50000000 0.00000000 0.25000000 F F T
0.50000000 0.00000000 0.37500000 F F T
0.12500000 0.37500000 0.06250000 F F T
0.12500000 0.37500000 0.18750000 F F T
0.12500000 0.37500000 0.31250000 F F T 我想对上述文件执行的操作:
我想要将第一列复制到一个名为test.vasp
10的新文件中,如果第三列是>=0.25,那么第一列应该按0.025增加,整行应该被追加到test1.vasp
10之后,如果第三列是<0.25,那么整行应该被附加到test1.vasp
0.025 to 0.25到test1.vasp to test10.vasp重复
我尝试了以下命令,但该命令不起作用:
for ((i=1;i<=10;i++));do
outputfile=test"$i".vasp
awk -v I=$i 'NR > 9 && $3+0 >= 0.25 {
p = $1; p =($I * 0.025); sub(/[^ \t]+/, sprintf("%.8f", p)) } 1' $inputfile > $outputfile
done请在awk或sed中提出解决方案。
发布于 2020-06-24 17:38:55
您可以使用这个awk脚本。
cat incr.awk
NR <= 9 {
s = s $0 ORS
next
}
{
r[++n] = $0
}
END {
for (i=1; i<=10; i++) {
fn = "test" i ".vasp"
printf "%s", s > fn
for (k=1; k<=n; ++k) {
split(r[k], a)
if (a[3] >= 0.25) {
sub(/[^\t]+/, sprintf("%.8f", a[1] + .025), r[k])
}
print r[k] > fn
}
close(fn)
}
}然后将其运行为:
awk -f incr.awk file发布于 2020-06-24 16:38:56
不要多次调用awk,只需为awk中的每一行写入多个输出文件,如下所示:
{
c=0
for (i=0.025; i<=0.25; i+=0.025) {
print ...whatever... >> ("test" (++c) ".vasp")
}
}发布于 2020-06-24 17:28:23
对于数字部分,您可以这样做
$ awk 'NR>9{for(i=1;i<=10;i++)
{f="test" i ".vasp";
if($3>=0.25) $1=sprintf("%.8f",$1+0.25)
print > f}}' file会给
$ head *.vasp | column -t
==> test1.vasp <==
0.00000000 0.00000000 0.00000000 F F F
0.00000000 0.00000000 0.12500000 F F T
0.25000000 0.00000000 0.25000000 F F T
0.25000000 0.00000000 0.37500000 F F T
0.50000000 0.00000000 0.00000000 F F F
0.50000000 0.00000000 0.12500000 F F T
0.75000000 0.00000000 0.25000000 F F T
0.75000000 0.00000000 0.37500000 F F T
0.12500000 0.37500000 0.06250000 F F T
0.12500000 0.37500000 0.18750000 F F T
==> test10.vasp <==
0.00000000 0.00000000 0.00000000 F F F
0.00000000 0.00000000 0.12500000 F F T
2.50000000 0.00000000 0.25000000 F F T
2.50000000 0.00000000 0.37500000 F F T
0.50000000 0.00000000 0.00000000 F F F
0.50000000 0.00000000 0.12500000 F F T
3.00000000 0.00000000 0.25000000 F F T
3.00000000 0.00000000 0.37500000 F F T
0.12500000 0.37500000 0.06250000 F F T
0.12500000 0.37500000 0.18750000 F F T
==> test2.vasp <==
0.00000000 0.00000000 0.00000000 F F F
0.00000000 0.00000000 0.12500000 F F T
0.50000000 0.00000000 0.25000000 F F T
0.50000000 0.00000000 0.37500000 F F T
0.50000000 0.00000000 0.00000000 F F F
0.50000000 0.00000000 0.12500000 F F T
1.00000000 0.00000000 0.25000000 F F T
1.00000000 0.00000000 0.37500000 F F T
0.12500000 0.37500000 0.06250000 F F T
0.12500000 0.37500000 0.18750000 F F T
==> test3.vasp <==
0.00000000 0.00000000 0.00000000 F F F
0.00000000 0.00000000 0.12500000 F F T
0.75000000 0.00000000 0.25000000 F F T
0.75000000 0.00000000 0.37500000 F F T
0.50000000 0.00000000 0.00000000 F F F
0.50000000 0.00000000 0.12500000 F F T
1.25000000 0.00000000 0.25000000 F F T
1.25000000 0.00000000 0.37500000 F F T
0.12500000 0.37500000 0.06250000 F F T
0.12500000 0.37500000 0.18750000 F F Thttps://stackoverflow.com/questions/62559210
复制相似问题