如何使用AWK编辑特定行并复制rest?
我有以下文件名为如何使用AWK编辑特定行并复制rest?,awk,sed,Awk,Sed,我有以下文件名为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 dynam
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
我要对上述文件执行的操作:
9
复制到名为test.vasp
10
之后,如果第三列>=0.25
,则第一列应增加0.025
,并且应将整行添加到测试。vasp
10
以后
请在
awk
或sed
中建议解决方案。您可以使用此awk
:
awk 'NR > 9 && $3+0 >= 0.25 { $1 += .025 } 1' file > test.vasp
awk 'NR > 9 && $3+0 >= 0.25 {
p = $1; p += .025; sub(/[^ \t]+/, sprintf("%.8f", p)) } 1' file > test.vasp
cat test.vasp
请注意,在此过程中,列之间的前导空格和多个空格可能会被截断。如果要保留这些,请使用此awk
:
awk 'NR > 9 && $3+0 >= 0.25 { $1 += .025 } 1' file > test.vasp
awk 'NR > 9 && $3+0 >= 0.25 {
p = $1; p += .025; sub(/[^ \t]+/, sprintf("%.8f", p)) } 1' file > test.vasp
cat test.vasp
谢谢@anbhava,成功了!编辑的行有空格,而未编辑的行有制表符。有没有办法让awk保持与输入文件相同的间距?是的,检查第二个awk解决方案。现在我在这个答案的基础上@anubhava构建。我可以用FOR循环的变量乘以0.025吗?我想生成10个不同的文件,从0.025乘以0。25@Sufyan:这是可以做到的,但如果您想在单个awk命令中实现这一点,那么在这个解决方案中这并不是一个微不足道的更改。我可以请你发布一个新的问题,这样我们会更清楚,你会得到更多的答案。问题是:谢谢!