입력 파일을 세 개의 열로 분할하고 세 번째 열을 기준으로 정렬 [닫기]

입력 파일을 세 개의 열로 분할하고 세 번째 열을 기준으로 정렬 [닫기]

지금까지 내 스크립트(script.sh)는 다음과 같습니다.

#!/bin/bash/

BEGIN {  
        print "Author    Name of Book     ISBN"  
        print "------    ------------     ----"  
}  
{ printf "%-9s &s\n", 1$, 2$, 3$ }  
END  

그런 다음 다음 명령을 실행합니다.

sort -k 3,3 INPUTFILE.INPUT | awk -f script.sh  

위의 어느 것도 원하는대로 작동하지 않습니다.

또한 입력 파일의 데이터는 쉼표로 구분됩니다. 또한 awk 명령이 수행하기를 바라는 "루프"를 사용해야 합니다.

답변1

다음은 몇 가지 문제, 일부는 오류 발생, 다른 일부는 오타 또는 오해의 결과입니다.

  1. - 행을 #!삭제할 수 있습니다. 아니면 삭제해야 합니까?

    #!/usr/bin/awk -f
    

    awk(또는 시스템의 어느 곳에서나). 위의 -line을 사용하면 명령줄에서 스크립트를 호출 #!할 필요가 없지만 직접 사용할 수 있습니다(실행 가능한 경우). -line이 없으면 명령줄에서 사용해야 합니다 .awk -f./script.awk#!awk -f

  2. 입력 데이터의 특정 필드에 있는 값을 참조하려면 참조하는 필드 번호 대신 $nwhere를 사용하세요 .nn$

  3. 형식 printf문자열에는 형식 자리 표시자가 하나만 있지만 세 가지 데이터를 제공합니다. 또한 매개변수 주위에는 괄호가 없습니다.

  4. 블록 END을 제거할 수 있습니다.

  5. 입력에 공백(공백 또는 탭)으로 구분되지 않고 ,또는 같은 필드 구분 기호가 있는 경우 또는 등을 사용 하거나 블록의 적절한 문자에 변수를 설정하여 이를 표시해야 합니다 . 그렇지 않으면 스크립트가 입력 레코드를 잘못 분할합니다.|awkawk -F ','awk -F '|'FSBEGIN

그러면 스크립트( )가 남습니다 script.awk.

BEGIN {
    fmt = "%-15s\t%-15s\t%-15s\n"
    printf(fmt, "Author", "Name of Book", "ISBN")  
    printf(fmt, "------", "------------", "----")  
}

{ printf(fmt, $1, $2, $3) }

나는 세 개의 탭으로 구분된 필드 각각을 왼쪽 맞춤 문자열로 형식화하는 형식 문자열을 자유롭게 도입했습니다. 각 필드에는 15자의 공백이 있습니다. 블록을 변경하여 쉽게 fmt조정할 수 있습니다 BEGIN.

통화는 다음과 같습니다.

sort -t ',' -k 3,3 INPUTFILE.INPUT | awk -F ',' -f script.awk

여기서는 파일의 데이터가 쉼표로 구분되어 있다고 가정합니다(그리고 sort이에 따라 명령이 변경되었습니다).

관련 정보