
나는 파일을 가지고 있습니다 :
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
awk
Steeldriver가 제안한 대로 다음과 같이 더 간단하게 수정할 수 있습니다 .
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