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

awk1970年代後半、Unix V7で初めてリリースされました。

それ以来、かなりの変化があり、その一部は以前のバージョンと互換性がありません。

GNUawkマニュアルにはトピックに関する非常に有益なセクション

awk他の多くのユーティリティと同様に、Solaris(他のほとんどのUniceとは異なり)は、他の名前(nawk)または別の場所(/usr/xpg4/bin/awk、デフォルトではこの機能は使用できません)で、古くて役に立たない実装を基本ユーティリティに固執するという立場をとりました。 Solaris 11の一部のシン構成では)。

Solarisでネイティブ環境を使用している場合は、古い/古い方法で実行されるユーティリティで終わることがよくあります。たとえば、Solaris 11以前では、shデフォルト環境は標準シェルではなくBourneシェルでした。他の多くのユーティリティ(grep、、、、... )はPOSIXと互換性がなく、1992バージョンの標準とも互換性がありませんsedtaildf

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/getconfPATH/usr/xpg6/bin:/usr/xpg4/bin:/usr/ccs/bin:/usr/bin:/opt/SUNWspro/bin

おすすめ記事