Awk 在不丢失空格/格式的情况下,为一系列行更改特定列中的字符串

Awk 在不丢失空格/格式的情况下,为一系列行更改特定列中的字符串,awk,curly-braces,Awk,Curly Braces,我有一个包含许多行的文件,但我希望在不丢失列之间的原始制表符/间距的情况下,将第五列中前4635行的字符串X更改为另一个字符串a 我希望改变(特定范围的线路) 进入 我想出了以下代码 awk '{if (NR>=1&&NR<=4635) split($0, a, FS, seps); a[5]="A"; for (i=1;i<=NF;i++) printf("%s%s", a[i], seps[i]); print &qu

我有一个包含许多行的文件,但我希望在不丢失列之间的原始制表符/间距的情况下,将第五列中前4635行的字符串
X
更改为另一个字符串
a

我希望改变(特定范围的线路)

进入

我想出了以下代码

awk '{if (NR>=1&&NR<=4635) split($0, a, FS, seps); a[5]="A"; for (i=1;i<=NF;i++) printf("%s%s", a[i], seps[i]); print ""}' dat > tmp

awk'{if(NR>=1&&NR添加花括号/大括号和
else
分支:

awk '{if (NR>=1&&NR<=4635) {split($0, a, FS, seps); a[5]="A"; for (i=1;i<=NF;i++) printf("%s%s", a[i], seps[i]); print ""} else {print}}' dat > tmp

awk'{if(NR>=1&&NR添加花括号/大括号和
else
分支:

awk '{if (NR>=1&&NR<=4635) {split($0, a, FS, seps); a[5]="A"; for (i=1;i<=NF;i++) printf("%s%s", a[i], seps[i]); print ""} else {print}}' dat > tmp

awk'{if(NR>=1&&NR,第三个参数的GNU awk与
匹配()
\s/\s
速记:

$ awk 'NR<4636{match($0,/((\S+\s+){4}).(.*)/,a); $0=a[1] "A" a[3]} 1' file
ATOM   2732  HN  SER A 176     181.410 174.270 311.410  0.00  0.00
ATOM   2733  CA  SER A 176     180.170 172.920 310.330  0.00  0.00
ATOM   2734  HA  SER A 176     179.860 171.950 310.720  0.00  0.00
ATOM   2735  CB  SER A 176     179.010 173.910 310.790  0.00  0.00
ATOM   2736  HB1 SER A 176     178.020 173.710 310.340  0.00  0.00
ATOM   2737  HB2 SER A 176     178.910 173.930 311.900  0.00  0.00

$awk'NR第三个参数的GNU awk要
匹配()
\s/\s
速记:

$ awk 'NR<4636{match($0,/((\S+\s+){4}).(.*)/,a); $0=a[1] "A" a[3]} 1' file
ATOM   2732  HN  SER A 176     181.410 174.270 311.410  0.00  0.00
ATOM   2733  CA  SER A 176     180.170 172.920 310.330  0.00  0.00
ATOM   2734  HA  SER A 176     179.860 171.950 310.720  0.00  0.00
ATOM   2735  CB  SER A 176     179.010 173.910 310.790  0.00  0.00
ATOM   2736  HB1 SER A 176     178.020 173.710 310.340  0.00  0.00
ATOM   2737  HB2 SER A 176     178.910 173.930 311.900  0.00  0.00

$awk'NR如果您的输入是固定宽度字段,如示例中所示,那么您可以将
字段宽度
GNU awk
一起使用:


awk-v FIELDWIDTHS='21 1*'-v OFS='NR如果您的输入是固定宽度的字段,如示例所示,那么您可以将
FIELDWIDTHS
GNU awk
一起使用:


awk-v FIELDWIDTHS='21 1*'-v OFS='21 1''NR您应该提到,第四个参数拆分()需要GNU awk。此外,您可以删除
NR>=1,因为这是一个UUONR!您应该提到第四个参数拆分()需要GNU awk。此外,您可以删除
NR>=1
,因为这是一个uOnr!这能回答您的问题吗?这能回答您的问题吗?很好地使用FIELDWIDTHS加上null OFS!很好地使用FIELDWIDTHS加上null OFS!
$ awk 'NR<4636{match($0,/([^[:space:]]+[[:space:]]+){4}./); $0=substr($0,1,RLENGTH-1) "A" substr($0,RLENGTH+1)} 1' file
ATOM   2732  HN  SER A 176     181.410 174.270 311.410  0.00  0.00
ATOM   2733  CA  SER A 176     180.170 172.920 310.330  0.00  0.00
ATOM   2734  HA  SER A 176     179.860 171.950 310.720  0.00  0.00
ATOM   2735  CB  SER A 176     179.010 173.910 310.790  0.00  0.00
ATOM   2736  HB1 SER A 176     178.020 173.710 310.340  0.00  0.00
ATOM   2737  HB2 SER A 176     178.910 173.930 311.900  0.00  0.00