awk를 사용하여 마지막 두 열을 인쇄하는 방법


106

내가 원하는 것은 인쇄 된 마지막 두 열입니다.


6
왜 이것이 87 개의 찬성표를 가지고 있는지는 확실하지 않지만, 최소한 예제를 통해 확실히 개선 할 수 있습니다.
Arj

아마도 질문은 본질적으로 매우 간단하고 예없이 쉽게 이해할 수 있기 때문에 드물지만이 경우에는 효과가있는 것처럼 보입니다. 여기서 문제는 정보 부족이 아니라 독립적 인 연구가 부족하다는 점입니다.
DryLabRebel

이 질문은 또한 중복 질문입니다.
DryLabRebel

이것이 귀하의 질문에 대답합니까? awk에서 두 번째 마지막 열 / 필드 인쇄
DryLabRebel

답변:


194

NF입력 레코드의 총 필드 수로 설정된 변수 를 사용할 수 있습니다 .

awk '{print $(NF-1),"\t",$NF}' file

이것은 최소한 2 개의 필드가 있다고 가정합니다.


1
쉼표가 필요합니다. 오늘날 우리는 까다롭기 때문에 공백은 필드를 연결하고 쉼표는 인쇄 문에서 필드를 구분합니다. 두 필드를 병합합니다
jim mcnamara

18
이제 "field-OFS-tab-OFS-field"를 인쇄하고 있습니다. awk '{print $(NF-1) "\t" $NF}' file또는 awk '{print $(NF-1), $NF}' file또는 이어야합니다 awk 'BEGIN{OFS="\t"} {print $(NF-1), $NF}' file.
추후 공지가있을 때까지 일시 중지되었습니다.

이전 주석에 추가하기 만하면 사용시 문제 '{print $x,"\t",$y}'는 awk가 각 쉼표로 구분 된 변수를 자체 필드로 해석하므로 결과는 실제로 field1<space><tab><space>field2, (기본적으로 공백 구분 기호를 사용하기 때문에) field1<tab>field2가 될 것입니다. 당신은 기대하고 있습니다. OFS (Output Field Separator)를 사용하는 것은 거의 항상 원하는 것입니다.
DryLabRebel

13
awk '{print $NF-1, $NF}'  inputfile

참고 : 이는 두 개 이상의 열이있는 경우에만 작동합니다. 하나의 열이있는 레코드에서는 가짜가됩니다."-1 column1"


3
시도하고보십시오. Solaris 9 awk & nawk에서 작동합니다. 대안은 $ (NF-1)입니다
jim mcnamara

1
@coaddict-다른 awk 구현으로 작업하지 않은 것 같습니다. 오래된 awks 행동이 (아마도 잘못되었을 수도 있습니다) 앞으로 나왔습니다. 나는 테스트 할 gawk가 없습니다. 그래서 나는 당신의 의견이 왜 abnput이되었는지 확실하지 않습니다. Linux awk는 일반적으로 gawk입니다. 테스트하고 다시 게시하겠습니다. 한편 Soalris 또는 HPUX 또는 DGX 또는 이전 awk가 의미하는 바를 확인하려면 무엇이든 시도하십시오.
짐 맥나마라

6
당신은 아마 당신이 시도했기 때문에 그것이 효과가 있다고 생각하도록 속았을 것입니다 echo 1 2 3 | awk .... $NF-1($NF) - 1모든에 awk구현입니다.
Stephane Chazelas

"One True Awk"소스 코드에는 yacc문법 에서 40 개 이상의 충돌이 있습니다. A가 awk에서 의미하는 바를 고려할 때 아이러니합니다. awk의 다른 버전이 다르게 구문 분석합니까? 큰 놀라움!
카즈

1
@THESorcerer, try with- echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}'또는 두 번째 마지막 필드가 마지막 필드보다 작지 않은 다른 입력.
glenn jackman

6

@jim 맥나마라 : 주위에 괄호를 사용하여 시도 NF, 즉 $(NF-1)$(NF)대신 $NF-1$NF(FreeBSD를위한 맥 OS X 10.6.8에서 작동 awk하고 gawk).

echo '
1 2
2 3
one
one two three
' | gawk '{if (NF >= 2) print $(NF-1), $(NF);}'

# output:
# 1 2
# 2 3
# two three

우리는 이미 ()를 이미 고려했습니다. 나는 원래의 오래된 awk 행동이 어디에서 왔는지 논의하고 있다고 생각했습니다.
jim mcnamara

+1은 명시적인 답변에 대한 $(NF-1)것입니다 $NF-1. 확실히 덜 모호합니다. $(NF)하지만 과잉입니다-그냥 $NF할 것입니다. 열이 2 개 미만인 줄을 보호하는 것도 가치가 있습니다. 한 열 줄에서는 첫 번째 열 값을 두 번 얻고 0 열 (즉, 빈 줄)을 사용하면 시도로 인해 awk 명령이 모두 실패합니다. 인덱스가 -1 인 필드에 액세스합니다.
mklement0

1

gawk를 사용하면 문제가 발생합니다.

 gawk '{ print $NF-1, $NF}' filename
1 2
2 3
-1 one
-1 three
# cat filename
1 2
2 3
one
one two three

방금 솔라리스 10 M4000에 gawk를 넣었습니다. 그래서 gawk는 $ NF-1 대 $ (NF-1) 문제에 대한 cuplrit입니다. 다음 질문 POSIX는 무엇을 말합니까? 당 :

http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html

어느 쪽이든 방향은 없습니다. 안좋다. gawk는 빼기를 의미하고 다른 awk는 필드 번호 또는 빼기를 의미합니다. 흠.


1
샘플 입력 파일의 처음 두 줄은 동작 모두 에서 동일한 출력을 생성한다는 점에서 도움이되지 않습니다 . 이 경우 Solaris awk가 실제로 gawk처럼 작동하지 않는다는 것을 다시 확인해 주시겠습니까?
mklement0

AWK 사양에 귀하의 링크에 관해서는 : 사용에 대한 일화 인수 $(NF-1): 그 사양에 양식이 모두 사용 필드 인덱스를 계산하는 두 가지 예입니다 $(NF-1)$(NF+2). 그런 다음 "Expressions in awk"섹션이 있는데,이 섹션 $exprexpr - expr. 이후 NF표현 자체가, $NF-1에 평가해야합니다 ($NF)-1. 어쨌든로 평가 $NF-1되는 awk 구현이 실제로 존재하더라도 $(NF-1)여기서 배운 교훈은 사용 $(NF-1)이 안전하고 이식 가능한 선택이라는 것입니다.
mklement0

0

이것으로 시도

$ cat /tmp/topfs.txt
/dev/sda2      xfs        32G   10G   22G  32% /

awk print last column
$ cat /tmp/topfs.txt | awk '{print $NF}'

awk print before last column
$ cat /tmp/topfs.txt | awk '{print $(NF-1)}'
32%

awk - print last two columns
$ cat /tmp/topfs.txt | awk '{print $(NF-1), $NF}'
32% /

0

가능한 모든 시나리오를 고려하기 위해 이것을 시도하십시오.

awk '{print $(NF-1)"\t"$NF}'  file

또는

awk 'BEGIN{OFS="\t"}' file

또는

awk '{print $(NF-1), $NF} {print $(NF-1), $NF}' file
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.