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에서 처음 출시되었습니다.

그 이후로 상당한 변화가 있었으며 그 중 일부는 이전 버전과 호환되지 않습니다.

GNU awk매뉴얼에는주제에 대한 매우 유익한 섹션.

awk다른 많은 유틸리티와 마찬가지로 Solaris(대부분의 다른 Unices와는 달리) 는 다른 이름( nawk) 또는 다른 위치( /usr/xpg4/bin/awk, 기본적으로 이 기능을 사용할 수 없음) 로 오래되고 쓸모없는 구현을 기본 유틸리티로 고수하는 입장을 취했습니다. Solaris 11의 일부 씬 구성에서는).

Solaris에서 기본 환경을 사용하는 경우 오래된/낡은 방식으로 실행되는 유틸리티로 끝나는 경우가 많습니다. 예를 들어, Solaris 11 이전에는 sh기본 환경이 표준 쉘이 아닌 Bourne 쉘이었습니다. 다른 많은 유틸리티( grep, sed, tail, df...)는 POSIX와 호환되지 않으며 1992 버전의 표준과도 호환되지 않습니다.

Solaris는 POSIX(및 Unix) 인증 시스템(적어도 일부 구성에서는)이지만 POSIX/Unix에서는 시스템이 주어진(문서화된) 환경(기본 환경이 아닐 수 있음)에서만 호환되도록 요구합니다.

따라서 솔라리스로 이식해야 하는 코드를 작성할 때는 다른 시대의 구문을 사용하여 작성하거나 반드시 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합니다 . 그러면 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

관련 정보