행에서 마지막 3개 필드를 잘라내고 총 마크 수를 인쇄하는 방법

행에서 마지막 3개 필드를 잘라내고 총 마크 수를 인쇄하는 방법

다음 cli에서 마지막 세 필드를 잘라내는 방법

cat file.txt

산출

        Topic: __consumer_offsets       Partition: 0    Leader: 1002    Replicas: 1002,1001,1003        Isr: 1002,1003,1001
        Topic: __consumer_offsets       Partition: 1    Leader: 1003    Replicas: 1003,1002,1001        Isr: 1002,1003,1001
        Topic: __consumer_offsets       Partition: 2    Leader: 1001    Replicas: 1001,1003,1002        Isr: 1002,1003,1001
        Topic: __consumer_offsets       Partition: 3    Leader: 1002    Replicas: 1002,1003,1001        Isr: 1002,1003,1001

예상 출력

1002 1003 1001
1002 1003 1001
1002 1003 1001
1002 1003 1001

Number of tokens are : 12

우리는 성공하지 못한 채 다음을 시도했습니다.

cat file.txt |awk '{print $NF-3,$NF-2,$NF-1}'

답변1

필드 구분 기호로 쉼표와 공백 문자를 사용할 수 있습니다.

awk -F "[, ]" '{print $(NF-2),$(NF-1),$NF}' file

또한 최종 토큰 설명을 작성합니다.

awk -F "[, ]" '{print $(NF-2),$(NF-1),$NF;i++}END{print "Number of tokens are: " i*3}' file

답변2

두 개의 서로 다른 구분 기호(공백과 쉼표로 구분됨 - 무시하겠습니다)가 있으므로 :매우 신중하게 선택해야 합니다.필드 구분 기호.

기본값은 (하나 이상의) 공백이므로 명령문 $(NF-3),$(NF-2),$(NF-1)등이 실제로 인쇄되어야 합니다.

Replicas: 1002,1001,1003   Isr:

이는 줄에서 공백으로 구분된 네 번째에서 두 번째에서 마지막 토큰입니다.

작업을 위해 공백으로 구분된 마지막 토큰을 선택하고 다음과 같이 쉼표로 구분합니다.

awk '{n=split($NF,tokens,","); for (i=1;i<=n;i++) printf("%s%s",tokens[i],i==n?ORS:OFS)}' file.txt

그러면 마지막 필드를 가져와서 에 저장 $NF하고 결과 "하위 필드"를 배열에 저장합니다 . 그런 다음 하위 필드를 모두 인쇄하고 구분 문자는 "출력 필드 구분 기호"가 될 수 있습니다( 기본값은 공백) .split,tokensnOFS아니요배열의 끝이나 마지막 표시에 도달할 때 tokens"출력 레코드 구분 기호"(기본값은 줄 바꿈)입니다 .ORS

이렇게 하면 마지막 필드의 토큰 수를 유연하게 변경할 수도 있습니다.

합계를 인쇄하려면, 행은 다음과 같이 수정됩니다.

awk 'NF{n=split($NF,tokens,","); for (i=1;i<=n;i++) printf("%s%s",tokens[i],i==n?ORS:OFS); tot+=n}\
     END{printf("Number of tokens: %d\n",tot)}' file.txt

첫 번째 규칙 이전의 조건 NF은 빈 줄이 무시되도록 보장합니다(계산 논리를 혼동함).

~을 위한오직합계 인쇄, 다음 printf문을 생략할 수 있습니다.

awk 'NF{tot+=split($NF,tokens,",")} END{printf("Number of tokens: %d\n",tot)}' file.txt

관련 정보