如何在不丢失awk格式的情况下替换整个列

编者注:

这个问题有一个困难的编辑历史,因为一个善意但误导的编辑(引入了无关的,“漂亮”的格式依赖于空格和|字符来分隔列)暂时混淆了这个问题(自从还原后).

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

信用额度为https://stackoverflow.com/a/39326264/2032943

点赞