2014-01-08 1 views
0

파일에서 대부분의 중복 행을 제거하려고합니다 (또는 더 정확하게는 스크립트 출력의 파이프 출력). 그러나 특정 패턴을 포함하는 다른 행을 유지하려고합니다. 은 단순히 모든 중복을 제거하고자하는 경우다른 사본을 유지하면서 특정 중복 행을 제거합니다.

awk '!($1 in a){a[$1];print}' OR 
awk '!x[$0]++' 

일 큰 것을 여기에 다른 곳에서 본 적이. 그러나이 메커니즘에 조건을 쉽게 추가 할 수 있습니까?

예를 들어, 어디서 모든 라인을 유지하려면 :

$1==".:"||$1==":."||$1==":"||$1="." 

하지만, 다른 라인은, 내가 중복되지 않습니다해야 할 것입니다. 아래 예제에서 "/ bin"과 "/ usr/bin"을 제거하고 싶습니다.

/bin 
: 
/usr/bin 
: 
/usr/openwin/bin 
: 
/usr/bin 
: 
/usr/etc 
: 
/etc 
:. 
: 
a 
: 
/usr/bin/X11 
: 
. 
: 
/bin 
: 

감사

이 당신을 위해 작동합니다

답변

0

:

awk '!($1 in a) || ($1 == ":") || ($1 == ":.") || ($1 == ".:") || ($1 == ".") {a[$1];print}' 
0

이 일을합니까?

awk '($1==".:"||$1==":."||$1==":"||$1="."||!x[$0]++)' $file 
+0

이 질문에 대한 답변을 제공하지 않습니다. 비평하거나 저자의 설명을 요청하려면 게시물 아래에 의견을 남겨 둡니다. – ScottJShea

+0

대답이 아닌 방법은 무엇입니까? 그것은 문제를 해결해야 awk 명령 줄을 제안합니다. 그것이 제대로 작동한다고 가정하면 (그것은 내 최종 테스트가 간단합니다) 올바른 것입니다. 이 질문에 게시 된 다른 두 가지 답변보다 적은 답변입니다. –

0
$ awk '!seen[$0]++ || ($1 ~ /^(\.:|:\.|:|\./)$)' file  
/bin 
: 
/usr/bin 
: 
/usr/openwin/bin 
: 
: 
/usr/etc 
: 
/etc 
:. 
: 
a 
: 
/usr/bin/X11 
: 
. 
: 
: 
관련 문제