该文件包含
cat file
a
b
c
b
d
Run Code Online (Sandbox Code Playgroud)
尝试通过删除 SunOS 上的重复行
awk '!x[$0]++' file
Run Code Online (Sandbox Code Playgroud)
(如在另一个帖子中发现的)导致语法错误
awk: syntax error near line 1
awk: bailing out near line 1
Run Code Online (Sandbox Code Playgroud)
我缺少什么?
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'
Run Code Online (Sandbox Code Playgroud)
这将在 1978 年awk的 Unix v7 和 Solaris 中工作/bin/awk(在原始版本中awk,您不能使用任何任意表达式作为模式,它必须是使用关系运算符的条件,例如==此处)。
或者:
nawk '!x[$0]++'
Run Code Online (Sandbox Code Playgroud)
或者:
/usr/xpg4/bin/awk '!x[$0]++'
Run Code Online (Sandbox Code Playgroud)
或者更一般地说,要拥有所有实用程序(包括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]++'
Run Code Online (Sandbox Code Playgroud)
双方/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可以让您PATH喜欢/usr/xpg6/bin:/usr/xpg4/bin:/usr/ccs/bin:/usr/bin:/opt/SUNWspro/binXPG6(SUSv3,POSIX 2001 的超集)一致性(它与 XPG4 冲突,实际上不太可能影响您)。