【发布时间】:2017-01-01 16:48:42
【问题描述】:
编者注:
这个问题有一个麻烦的编辑历史,因为一个善意但被误导的编辑(它引入了不相关的、“漂亮”的格式,依赖于空格和| 字符。分隔列)暂时混淆了这个问题(因为已恢复)。
OP 的前提是输入是 tab 分隔的,即使这没有直接反映在此处显示的示例输入中。
我有一个包含 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
任何人都可以建议替代解决方案或更改上述命令吗?
【问题讨论】:
-
试试:
awk -v new="81115" 'BEGIN{OFS=FS="\t"} {$5=new}1' file -
您的所有解决方案#2 版本在这里都可以正常工作。解决方案 #1 也可以,只需添加
-v OFS="\t"即可。我用 MAWK 和 GAWK 进行了测试。测试您的输入文件是否真的是制表符分隔的。 -
alternate..
perl -pe 's/^(\S+\s+){4}\K\S+/81115/' file > file.NEW.. 或者如果第 5 列始终是81216并且在文件中是唯一的,为什么不简单的sed 's/81216/81115/' file > file.NEW -
等一下 - 你说你的字段是制表符分隔的,但你用
|s 和空格分隔它们。哪个是对的?如果您的示例输入/输出旨在向我们展示您的文件在表格格式中的外观而不是您的实际文件 - 不要那样做,向我们展示实际文件,而不是它们的一些图形表示。如果这些确实是您的实际文件 - 您所说的分隔字段的选项卡在哪里?如果您的解决方案 2 脚本中的任何一个将字段附加到行尾,那是因为您的输入文件 不是 制表符分隔。 -
@EdMorton:完全同意你的观点,最后一个问题编辑导致了这一点。我最初将问题更新为制表符分隔并拒绝了当前存在的问题,但不知何故它进入了。请参阅此编辑历史记录stackoverflow.com/posts/39142140/revisions