awk에서 후행 쉼표를 피하면서 출력 레코드를 ','로 구분하는 방법

awk에서 후행 쉼표를 피하면서 출력 레코드를 ','로 구분하는 방법

다음 awk명령문과 그 출력을 고려하십시오.

$ awk -F "/" '/\/tcp/ {print $1}' input_file

10\n
20\n

내가 원하는 출력은 다음과 같습니다.

10,20

내가 시도한 것은 다음과 같습니다.

$ awk -F "/" 'BEGIN{ORS=","} /\/tcp/ {print $1}' input_file
10,20,

마지막에 쉼표를 제거하는 방법은 무엇입니까?

답변1

ORS를 로 설정하지 마십시오. ,그러면 스크립트의 출력이 줄 바꿈으로 끝나지 않으므로 POSIX에 따라 유효한 텍스트 파일이 아니므로 이를 사용하여 호출하는 다른 스크립트와 동일한 작업을 수행합니다. 대신, 플랫폼이 가져야 하는 모든 값을 보유하도록 ORS를 그대로 두고 ,출력하려는 ​​모든 문자열 앞에 첫 번째 문자열을 제외한 모든 문자열을 인쇄합니다.

awk -F '/' '/\/tcp/{printf "%s%s", sep, $1; sep=","} END{print ""}'

예를 들어:

$ seq 3 | awk '{printf "%s%s", sep, $0; sep=","} END{print ""}'
1,2,3

답변2

개인적으로 저는 인쇄 후에 쉼표를 제거하겠습니다.

awk -F "/" 'BEGIN{ORS=","}/\/tcp/ {print $1}' | sed 's/,$//'

또는 후행 줄바꿈을 추가하세요.

awk -F "/" 'BEGIN{ORS=","}/\/tcp/ {print $1}' | sed 's/,$/\n/'

정말로 이 작업을 에서 수행하려면 awk다소 우아하지 않은 다음 접근 방식을 시도해 볼 수 있습니다.

awk -F "/" '/\/tcp/{ if(NR == 1){ printf "%s", $1} else{ printf ",%s",$1}}'

그리고 후행 줄 바꿈을 추가하려면 다음을 수행하십시오.

awk -F "/" '/\/tcp/{ if(NR == 1){ printf "%s", $1} else{ printf ",%s",$1}}END{print ""}'

답변3

무응답은 awk질문이 설명된 것처럼 간단하다고 가정합니다.

paste -s -d',' input_file

-s, --serial파일을 순차적으로 처리함을 나타냅니다( paste보통 여러 파일의 줄을 병합하는 데 사용됨).

-d, --delimiters구분 기호 지정(기본값은 탭)

답변4

당신이 하고 있는 일은 수집된 데이터의 여러 행을 기반으로 단일 출력 레코드를 구축하는 것입니다. 그럼 이렇게 해보자:

awk -F '/' '
    BEGIN { OFS = "," }
    /\/tcp/ { a[++n] = $1 }
    END {
        $0 = ""
        for (i = 1; i <= n; ++i)
            $i = a[i]
        print
    }' input_file

이는 데이터를 배열로 수집 a하고 END해당 배열의 필드를 사용하여 블록에 새 레코드를 작성합니다. 존재하다매우마지막으로 기록을 인쇄합니다. OFS블록에 쉼표를 설정하므로 필드는 쉼표로 구분 됩니다 BEGIN.

시험:

$ awk -F '/' 'BEGIN {OFS=","} /\/tcp/ {a[++n]=$1} END {$0="";for (i=1;i<=n;++i) $i = a[i];print}' <<END_INPUT
first/tcp
no relevant
second/tcp
third/tcp
END_INPUT
first,second,third

(위의 마지막 줄은 출력이고, 입력은 여기에서 로 구분된 문서를 통해 제공됩니다 END_INPUT.)

관련 정보