该文件包含
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。许多其他实用程序(grep
、sed
、tail
、df
...)不符合 POSIX 标准,甚至不符合 1992 年版本的标准。
Solaris 是 POSIX(甚至 Unix)认证的系统(至少在某些配置中),但是 POSIX/Unix 仅要求系统在给定(记录的)环境中兼容(这可能不是默认环境)。
因此,当您编写需要移植到 Solaris 的代码时,您需要使用另一个时代的语法来编写,或者确保将自己置于 POSIX 环境中。
如何针对这些标准的给定版本执行此操作记录在standards(5)
Solaris 的手册页中。
因此,在awk
这里,您可以使用:
awk 'x[$0]++ == 0'
这在 1978 年的awk
Unix 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/getconf
XPG6 (SUSv3,POSIX 2001 的超集)PATH
一致性/usr/xpg6/bin:/usr/xpg4/bin:/usr/ccs/bin:/usr/bin:/opt/SUNWspro/bin
(它与 XPG4 冲突,实际上不太可能影响您)。