编者注:
这个问题有一个困难的编辑历史,因为一个善意但误导的编辑(引入了无关的,“漂亮”的格式依赖于空格和|字符来分隔列)暂时混淆了这个问题(自从还原后).
OP的前提是输入是制表符分隔的,即使它没有直接反映在此处显示的示例输入中.
我有一个包含6列的输入文件,它们是以制表符分隔的.我想用值’81115’替换第5列中的所有值,同时保持格式不变.
输入文件 :
203 ADD 24 IAC 81216 IT
204 ATT 24 IAC 81216 IT
期望的输出文件:
203 ADD 24 IAC 81115 IT
204 ATT 24 IAC 81115 IT
我的解决方案#1
我使用以下命令:
awk '{$5 = v} 1' v="81115" file > file.NEW
使用上面的命令,第5列将被替换,但列不再以制表符分隔.
输出文件 :
203 ADD 24 IAC 81115 IT
204 ATT 24 IAC 81115 IT
我的解决方案#2
为了保持格式化,我尝试使用以下命令:
awk -v replace="81115" -F '\t' -v OFS='\t' {$5=replace}1' file > file.NEW
要么
awk -F"\t" -v OFS="\t" '{$5=81115}1' file > file.NEW
要么
awk -F '\t' '{$5="81115";}1' OFS='\t' file > file.NEW
所有上述命令都保持格式不变,但最后添加了一个值为81115的新列;即,第7列被追加.
输出文件:
203 ADD 24 IAC 81216 IT 81115
204 ATT 24 IAC 81216 IT 81115
任何人都可以建议替代解决方案或更改上述命令吗?
最佳答案 对于保留格式的列内更新,您需要使用拆分功能.请注意,只有GNU awk支持带有第四个参数的split函数.
试试这个:
awk '{split($0, a, FS, seps) # split based on FS
a[5]="81115"; # Update the 5th column
for (i=1;i<=NF;i++) # print the data back
printf("%s%s", a[i], seps[i]) # keeping the separators
print ""}' # print a new line
一内胆:
awk '{split($0, a, FS, seps); a[5]="81115"; for (i=1;i<=NF;i++) printf("%s%s", a[i], seps[i]); print ""}' /tmp/data