このファイルには以下が含まれています。
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
1970年代後半、Unix V7で初めてリリースされました。
それ以来、かなりの変化があり、その一部は以前のバージョンと互換性がありません。
GNUawk
マニュアルにはトピックに関する非常に有益なセクション。
awk
他の多くのユーティリティと同様に、Solaris(他のほとんどのUniceとは異なり)は、他の名前(nawk
)または別の場所(/usr/xpg4/bin/awk
、デフォルトではこの機能は使用できません)で、古くて役に立たない実装を基本ユーティリティに固執するという立場をとりました。 Solaris 11の一部のシン構成では)。
Solarisでネイティブ環境を使用している場合は、古い/古い方法で実行されるユーティリティで終わることがよくあります。たとえば、Solaris 11以前では、sh
デフォルト環境は標準シェルではなくBourneシェルでした。他の多くのユーティリティ(grep
、、、、... )はPOSIXと互換性がなく、1992バージョンの標準とも互換性がありませんsed
。tail
df
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
します。これにより、XPG4(POSIX.1-1990、POSIX.2-1992、およびPOSIX.2a-1992の上位セット)規格に準拠します。 Solaris 11では、XPG6(SUSv3、POSIX 2001の上位セット)仕様も提供されています(XPG4と競合し、実際に影響を与える可能性が低い)。/usr/xpg4/bin/getconf PATH
$PATH
/usr/xpg4/bin:/usr/ccs/bin:/usr/bin:/opt/SUNWspro/bin
/usr/xpg6/bin/getconf
PATH
/usr/xpg6/bin:/usr/xpg4/bin:/usr/ccs/bin:/usr/bin:/opt/SUNWspro/bin