在特定列上查找和替换

在特定列上查找和替换

我喜欢使用 查找并替换特定列sed,因为我不知道为什么awk gsub()在我的 Unix (Solaris) 中不起作用,这就是我想使用sed.

样本数据:

122|abc|ds,we||wrqg
145|dw|ett,335||nxd
166|rotl|qqqp,eoepepe||ge
776|gge|022||pp
039|pot|011a||lot

在第三列,我想替换,管道()中的逗号(|

当我尝试使用时gsub(),出现错误:

awk '{gsub(",","|",$3)}1' in.file > out.file

awk: syntax error near line 1
awk: illegal statement near line 1
awk: syntax error near line 1
awk: bailing out near line 1

另外,我会将其导入到我的数据库(Oracle)中。如果将 的数据,替换为|,则更改后的数据记录将不在同一字段上。如何做呢?

输出应该是这样的。

122|abc|ds|we|wrqg
145|dw|ett|335|nxd
166|rotl|qqqp|eoepepe|ge
776|gge|022||pp
039|pot|011a||lot

任何人,我真的需要这个。

答案1

Solaris/usr/bin/awk上的各种功能的支持受到严重限制。特别是该gsub()功能没有实现。这在中进行了解释awkSolaris 上的手册

为此,您应该使用/usr/xpg4/bin/awk(或nawk“new awk”)。

您的代码也没有为 指定字段分隔符awk,因此$3永远不会包含任何内容,除非您的数据中碰巧有足够的空格意外创建了第三个空格分隔的字段。同样,您不指定输出字段分隔符,因此任何修改的行的字段都将由空格分隔。

反而:

/usr/xpg4/bin/awk -F '|' 'BEGIN { OFS=FS } { gsub(",", "|", $3); print }' file

要始终将其/usr/xpg4/bin/awk作为awkSolaris 上的默认值,请PATH="$(/usr/xpg4/bin/getconf PATH):$PATH"在 shell 的启动文件中使用。

相关内容