2014-05-15 3 views

답변

1

awk 스크립팅으로이 작업을 수행 할 수 있습니다.

awk 'BEGIN {col=3; sep=" "; forbidden=sep} {if (match(forbidden, sep $col sep) == 0) {forbidden=forbidden $col sep; print $0}}' input.file 

BEGIN 키워드는 3 열 값을 모니터링하는 데 사용되는 forbidden 문자열을 선언 : 다음 코드 조각은 내가 당신의 문제를 해결하기 위해 함께했다입니다. 그런 다음 match 키워드는 현재 행의 세 번째 열에 forbidden 값이 포함되어 있는지 확인합니다. 그렇지 않으면 열의 내용을 forbidden 목록에 추가하고 전체 행을 인쇄합니다.

여기에서 sep=" "은 분리 기호를 인스턴스화합니다. 우리는 서로 다른 값을 넣음으로써 생성 된 단어를 피하기 위해 각 forbidden 값 사이에 sep을 사용합니다. 예를 들어이 경우

1 1111 ta 
2 2222 to 
3 3333 t 
4 4444 tato 

세퍼레이터없이 ttatoforbidden 값으로 간주된다. 기본적으로 각 열을 구분하는 데 사용되므로 ""을 구분 기호로 사용하므로 열에는 이름에 공백이 포함될 수 없습니다.

복제본을 제거해야하는 열의 번호를 변경하려면 col=3을 필요한 열의 수 (전체 줄 0, 첫 번째 열의 경우 1, 두 번째, ...)

+0

입력을 주셔서 감사하지만 위의 파일에 대해서는 중복을 제거하지 않습니다. 나는 나의 파일을 위해 아래 출력을 얻는다. 1 1223 abc, 2 4234 weroi, 0 3234 omsder, 1 1111 abc '. '1 1111 abc'도 제거해야합니다. – KillBill

+0

@KillBill 나는 당신이 나의 코드를 복사하는 실수를했다고 믿는다 : 당신은'BEGIN {forbidden = ""}'을 써야한다 :'forbidden'는 구분 기호 (이 경우에는 빈 공간)로 초기화되어야하며, 그렇지 않으면 첫 번째 줄은 결코 일치하지 않을 것입니다 (금지 된 문자열에서 ** ""$ 3 ""** 패턴을 찾습니다) – Aserre

관련 문제