awk에서 두 번째 마지막 열 / 필드 인쇄


164

두 번째 마지막 열 또는 필드를 awk로 인쇄하고 싶습니다. 필드 수는 가변적입니다. 사용할 수 있어야 $NF하지만 어떻게 사용할 수 있는지 잘 모르겠습니다.

그리고 이것은 작동하지 않는 것 같습니다 :

awk ' { print ( $NF-- )  } '

10
NF마지막 필드 인덱스, 마지막 필드 $NF의 값입니다
glenn jackman

이제 말이 되네요 괄호 밖 달러가 내가 생각 작동 왜 그게
브라이언 G

답변:


279
awk '{print $(NF-1)}'

작동해야합니다


2
이것은 나를 위해 작동하지 않습니다. Ubuntu의 awk 3.1.8에 "title : 5 : command not found : NF-1"이 표시됩니다.
Gurgeh

3
나는 당신이 $ NF의 값을 변경하지 마십시오 확인하기 위해 사전 / 사후 감소를 피할 것
그레고리 Patmore

다음과 같은 마지막 세 번째 필드를 얻으려고하면이 문제가 발생합니다.awk -F '.' '{print $(NF-2)}'
gies0r

3
@Gurgeh : 이것은 $(..)사용중인 쉘에 따라 서브 쉘에서 명령을 호출 하기 때문에 발생 합니다. $ (NF-1)대신을 사용하여이 문제를 해결할 수 있습니다 $(NF-1).
wting

21

Chris Kannon의 작은 추가 답변 : 실제로 두 번째 마지막 열이있는 경우에만 인쇄하십시오.

(
echo       | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1     | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2   | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2 3 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
)

15

가장 간단합니다.

 awk '{print $--NF}' 

원본 $NF--이 작동하지 않는 이유는 표현식이 감소 전에 평가되기 때문입니다. 반면 접두사 감소는 평가 전에 수행되기 때문입니다.


니모닉으로이 동작은 C / Java와 동일합니다. int x = ++i int x = i++접두사는 먼저 증가를 의미합니다. postfix는 나중에 증가 함을 의미합니다 (먼저 할당).
Weekend


4

당신은 결과에서 멀지 않았습니다! 이것은 그것을한다 :

awk '{NF--; print $NF}' file

이것은 하나의 필드 수를 감소시켜 $NF이전의 두 번째 를 포함합니다.

테스트

몇 개의 숫자를 생성하고 5 개의 그룹으로 인쇄 해 봅시다 :

$ seq 12 | xargs -n5
1 2 3 4 5
6 7 8 9 10
11 12

각 줄에 두 번째를 인쇄 해 봅시다 :

$ seq 12 | xargs -n5 | awk '{NF--; print $NF}'
4
9
11

3

Chris Kannon의 awk 솔루션과 비슷한 Perl 솔루션 :

perl -lane 'print $F[$#F-1]' file

다음과 같은 명령 줄 옵션이 사용됩니다.

  • n 입력 파일의 모든 줄을 반복하고 모든 줄을 자동으로 인쇄하지는 않습니다.

  • l 처리하기 전에 줄 바꿈을 제거하고 나중에 다시 줄 바꿈

  • a자동 분할 모드 – 입력 라인을 @F어레이 로 분할합니다 . 공백으로 기본 분할

  • e 펄 코드를 실행

자동 @F분할 배열은 인덱스 [0]에서 시작하는 반면 awk 필드는 $ 1로 시작합니다.
$#F요소의 개수입니다@F


1
또는 이미 perl에서 제공 한 음수 색인을 사용하십시오.$F[-2]
Sundeep

2

rev 명령을 사용하여 오른쪽에서 왼쪽으로 시작하려고 했습니까? 이 경우 두 번째 열만 인쇄하면됩니다.

seq 12 | xargs -n5 | rev | awk '{ print $2}' | rev
4
9
11

1

먼저 값을 줄인 다음 인쇄하십시오.

awk ' { print $(--NF)}' file

또는

rev file|cut -d ' ' -f2|rev

0

열이 많고 마지막에 세 개의 cloum을 제외한 모든 열을 인쇄하려는 경우 도움이 될 수 있습니다.

awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.