Awk 在不丢失空格/格式的情况下,为一系列行更改特定列中的字符串
我有一个包含许多行的文件,但我希望在不丢失列之间的原始制表符/间距的情况下,将第五列中前4635行的字符串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
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