Linux   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在字段中替换后输出awk中的字段分隔符大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

在修改awk中的特定字段后,输出字段分隔符上的信息是否会丢失?如果有多个字段分隔符并且我希望它们被恢复会发生什么? 例如,假设我有一个简单的文件示例,其中包含: a:e:i:o:u 如果我只是运行一个awk脚本,它虑了输入字段分隔符,它会打印我文件中的每一行,例如运行 awk -F: '{print $0}' example 我会看到原来的一行.但是,如果我直接修改其中一个字段,例如同 awk
修改awk中的特定字段后,输出字段分隔符上的信息是否会丢失?如果有多个字段分隔符并且我希望它们被恢复会发生什么?

例如,假设我有一个简单的文件示例,其中包含

a:e:i:o:u

如果我只是运行一个awk脚本,它虑了输入字段分隔符,它会打印我文件中的每一行,例如运行

awk -F: '{print $0}' example

我会看到原来的一行.但是,如果我直接修改其中一个字段,例如同

awk -F: '{$2=$2"!"; print $0}' example

我没有得到原始行的修改版本,而是看到由认空格分隔符分隔的字段,即:

a e! i o u

我可以通过指定OFS来取回原始版本的修改版本,例如:

awk -F: 'BEGIN {OFS=":"} {$2=$2"!"; print $0}' example

但是,在这种情况下,有多个潜在的场分离器,但在多个分离器的情况下,是否有一种简单的方法来恢复原始分离器?

例如,如果示例同时具有:和;作为分隔符,我可以使用-F“:|;”处理文件但OFS不足以恢复原始分隔符的相对位置.

更明确地说,如果我们切换到包含的example2

a:e;i:o;u

我们可以使用

awk -F":|;" 'BEGIN {OFS=":"} {$2=$2"!"; print $0}' example2

(或-F“[:;]”)得到

a:e!:i:o:u

但是我们已经失去了:和;如果我们能够恢复,那将会得到维持

a:e!;i:o;u

解决方法

您需要使用GNU awk将第4个arg用于split(),这样可以保存分隔符,就像RT对RS一样:

$awk -F'[:;]' '{split($0,f,FS,s); $2=$2"!"; r=s[0]; for (i=1;i<=NF;i++) r=r $i s[i]; $0=r} 1' file
a:e!;i:o;u

没有自动填充的FS匹配字符串数组,因为每次将记录拆分为字段时,存储与FS匹配的字符串的时间和内存有多昂贵.相反,GNU awk人员为split()提供了第4个arg,这样你就可以在需要的时候自己动手.这是几年前在经验丰富的awk用户和gawk提供商之间的comp.lang.awk新闻组中进行长时间对话的结果,然后才同意这是最好的方法.

请参阅https://www.gnu.org/software/gawk/manual/gawk.html#String-Functions处的split().

大佬总结

以上是大佬教程为你收集整理的在字段中替换后输出awk中的字段分隔符全部内容,希望文章能够帮你解决在字段中替换后输出awk中的字段分隔符所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。