다음 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
,
tokens
n
OFS
아니요배열의 끝이나 마지막 표시에 도달할 때 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