如何在不丢失awk格式的情况下替换整个列
发布时间:2020-12-13 23:28:41 所属栏目:Linux 来源:网络整理
导读:编者注: 这个问题有一个困难的编辑历史,因为一个善意但误导的编辑(引入了无关的,“漂亮”的格式依赖于空格和|字符来分隔列)暂时混淆了这个问题(自从还原后). OP的前提是输入是制表符分隔的,即使它没有直接反映在此处显示的示例输入中. 我有一个包含6列的输
编者注:
这个问题有一个困难的编辑历史,因为一个善意但误导的编辑(引入了无关的,“漂亮”的格式依赖于空格和|字符来分隔列)暂时混淆了这个问题(自从还原后). 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,seps); a[5]="81115"; for (i=1;i<=NF;i++) printf("%s%s",seps[i]); print ""}' /tmp/data 信用额度为https://stackoverflow.com/a/39326264/2032943 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |