gpt4 book ai didi

awk - 如何在 awk 中替换整列而不丢失格式

转载 作者:行者123 更新时间:2023-12-03 07:44:02 26 4
gpt4 key购买 nike

编者注:
这个问题有一个麻烦的编辑历史,因为一次善意但误导性的编辑(引入了依赖于空格和 | 字符的不相关的“漂亮”格式来分隔列)暂时混淆了问题(因为已恢复)。
OP 的前提是输入是制表符分隔的,即使这没有直接反射(reflect)在此处显示的示例输入中。

我有一个包含 6 列的输入文件,它们以制表符分隔。我想将第 5 列中的所有值替换为值 '81115',同时保持格式不变。

输入文件:

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

任何人都可以建议替代解决方案或对上述命令进行更改吗?

最佳答案

对于保留格式的列内更新,需要使用 split 函数。请注意,只有 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

关于awk - 如何在 awk 中替换整列而不丢失格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39142140/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com