awk에서 마지막 줄을 반복하고 싶나요?

awk에서 마지막 줄을 반복하고 싶나요?

나는 파일을 가지고 있습니다 :

key value

blah blah
blah blah
blahblah
man1 boy1
blah blah
man1 boy2
man1 boy1

중복된 행을 제거하려면 다음을 수행합니다.

awk '/man1/ { print $1,$2} ' file | awk '!x[$0]++'

이 명령은 첫 번째 줄을 가져오고 다른 줄은 무시합니다.

man1 boy1 
man1 boy2

하지만 마지막 줄을 제외한 모든 줄을 무시하고 싶습니다.

man1 boy2 
man1 boy1

Ramesh가 말했듯이 나는 다음과 같은 것을 원합니다.

cat filename
blah blah
blah blah
blahblah
man1 boy1
blah blah
man1 boy2
man1 boy1
man1 boy2
man1 boy3
man1 boy4
man1 boy2

원하는 출력

man1 boy1
man1 boy3
man1 boy4
man1 boy2

답변1

tac filename |awk '/man1/ { print $1,$2} '| awk '!x[$0]++' | tac 

시험

좀 더 구체적인 입력으로 테스트하고 싶습니다. 그래서 내 테스트는 다음과 같습니다.

cat filename
blah blah
blah blah
blahblah
man1 boy1
blah blah
man1 boy2
man1 boy1
man1 boy2
man1 boy3
man1 boy4
man1 boy2

이제 위의 명령을 실행하고 출력을 얻습니다.

tac filename |awk '/man1/ { print $1,$2} '| awk '!x[$0]++' | tac
man1 boy1
man1 boy3
man1 boy4
man1 boy2

awkSteeldriver가 제안한 대로 다음과 같이 더 간단하게 수정할 수 있습니다 .

tac filename | awk '/^man1/ && !x[$2]++' | tac

답변2

다음 셸 스크립트를 사용하여 이 작업을 수행할 수 있습니다.

#!/bin/bash
awk '/man1/{pos[$0] = NR}
END {
  for(key in pos) reverse[pos[key]] = key
  for(nr=1;nr<=NR;nr++)
    if(nr in reverse) print reverse[nr]
}' yourfile

산출:

[root@host ~]# sh shell.sh
man1 boy1
man1 boy3
man1 boy4
man1 boy2

원천

답변3

그리고 zsh:

$ printf '%s\n' ${(Oau)${(MOa)${(f)"$(<file)"}:#man1*}}
man1 boy1
man1 boy3
man1 boy4
man1 boy2

사람들은매개변수 확장 플래그:

  • f: 개행으로 분할
  • ${(M)array:#pattern}: 패턴과 일치하는 요소로 확장됩니다.
  • Oa: 배열의 순서를 반대로 바꿈
  • u: 고유한

답변4

2단계 솔루션. 첫 번째 패스에서는 각 키에 대한 마지막 레코드의 레코드 번호를 배열로 캡처합니다. 두 번째 패스에서 레코드 번호가 배열에 있으면 인쇄합니다.

awk 'NR == FNR{if ($0 ~ /man/)x[$0]=NR; next};
     FNR == 1{for (k in x) y[x[k]]=k};
     (FNR in y)' file file
man1 boy1
man1 boy3
man1 boy4
man1 boy2

관련 정보