通过 awk '!x[$0]++' 文件删除重复行时出现语法错误

通过 awk '!x[$0]++' 文件删除重复行时出现语法错误

该文件包含

cat file
a
b
c
b
d

尝试通过以下方式删除 SunOS 上的重复行

awk '!x[$0]++' file

(如在另一个帖子中找到的)导致语法错误

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

我缺少什么?

答案1

awk于 70 年代末在 Unix V7 中首次发布。

从那时起,它发生了重大变化,其中一些不向后兼容。

GNUawk手册有关于该主题的内容非常丰富的部分

与许多其他实用程序一样,Solaris(与大多数其他 Unices 不同)采取的立场是坚持使用较旧的过时实现作为其默认awk实用程序,并以不同的名称 ( nawk) 或在不同的位置 ( /usr/xpg4/bin/awk、默认情况下,该功能在 Solaris 11 的某些精简配置中不可用)。

在 Solaris 上,如果您使用默认环境,您通常会得到以古老/过时的方式运行的实用程序。例如,在 Solaris 11 之前,sh默认环境中不会是标准 shell,而是 Bourne shell。许多其他实用程序(grepsedtaildf...)不符合 POSIX 标准,甚至不符合 1992 年版本的标准。

Solaris 是 POSIX(甚至 Unix)认证的系统(至少在某些配置中),但是 POSIX/Unix 仅要求系统在给定(记录的)环境中兼容(这可能不是默认环境)。

因此,当您编写需要移植到 Solaris 的代码时,您需要使用另一个时代的语法来编写,或者确保将自己置于 POSIX 环境中。

如何针对这些标准的给定版本执行此操作记录在standards(5)Solaris 的手册页中。

因此,在awk这里,您可以使用:

awk 'x[$0]++ == 0'

这在 1978 年的awkUnix v7 和 Solaris 中可以工作/bin/awk(在最初的版本中awk,你不能使用任何任意表达式作为图案,它必须是使用关系运算符的条件,如下==所示)。

或者:

nawk '!x[$0]++'

或者:

/usr/xpg4/bin/awk '!x[$0]++'

或者更一般地说,拥有所有实用程序(包括awk)的更健全(且更便携)的版本:

PATH=`getconf PATH`:$PATH export PATH
: ^ false || exec sh "$0" ${1+"$@"} # rexec with POSIX sh if we're
                                    # a Bourne shell
awk '!x[$0]++'

/usr/bin/getconf PATH都会/usr/xpg4/bin/getconf PATH给您一个$PATH类似:/usr/xpg4/bin:/usr/ccs/bin:/usr/bin:/opt/SUNWspro/bin,这将使您符合 XPG4(POSIX.1-1990、POSIX.2-1992 和 POSIX.2a-1992 的超集)一致性。在 Solaris 11 上,您还可以获得/usr/xpg6/bin/getconfXPG6 (SUSv3,POSIX 2001 的超集)PATH一致性/usr/xpg6/bin:/usr/xpg4/bin:/usr/ccs/bin:/usr/bin:/opt/SUNWspro/bin(它与 XPG4 冲突,实际上不太可能影响您)。

相关内容