첫 번째 패턴과 특수 패턴을 비교한 후 중복 라인 제거

첫 번째 패턴과 특수 패턴을 비교한 후 중복 라인 제거

첫 번째 탭으로 구분된 패턴을 비교한 후 중복된 줄을 제거하는 코드를 찾고 있습니다.

예: ( = 탭)

car ↦ ab ↦ 38/43
car ↦ ca ↦ 2/34
house ↦ ca ↦ 34/34
house ↦ d ↦ 2/3
house ↦ ht ↦ 3/7
boat ↦ as ↦ 5/5

ca두 번째 필드에 있는 줄을 삭제하면 안 된다는 제약 조건을 사용하여 중복된 줄을 삭제하고 싶습니다 .

결과:

car ↦ ca ↦ 2/34
house ↦ ca ↦ 34/34
boat ↦ as ↦ 5/5

어떤 아이디어가 있나요? sed와 sort를 시도했지만 작동하는 코드를 얻지 못했습니다.

답변1

중복된 항목이 있는 경우 항상 ca두 번째 필드로 사용되는 항목이 있다고 가정합니다.

예제 데이터에서 동일한 첫 번째 필드를 가진 모든 줄은 함께 그룹화되지만 항상 그런 것인지는 언급하지 않았습니다. 그렇다면 작업은 좀 더 간단하지만 아래의 awk 스크립트는 일치하는 행이 함께 그룹화되지 않은 경우에도 작동합니다.

dedup.awk

#!/usr/bin/awk -f

{
    if (!($1 in lines) || ($2 == "ca"))
        lines[$1] = $0
}

END{
    for (i in lines) 
        print lines[i]
}

입력 파일이 호출되면 data다음과 같이 실행합니다.

awk -f dedup.awk data

또는

awk -F '\t' -f dedup.awk data

탭을 필드 구분 기호로 사용하는지 확인합니다. 기본 필드 구분 기호는 하나 이상의 공백 및/또는 탭입니다. Fields자세한 내용은 gawk 매뉴얼 페이지를 참조하세요 .

awk 배열의 작동 방식으로 인해 출력 데이터는 소스 데이터와 동일한 순서가 아닐 수 있습니다. 약간 더 복잡한 프로그램을 사용하면 원래 순서를 유지할 수 있고 awk의 정렬 기능 중 하나를 사용하여 출력을 정렬할 수도 있지만 bash sort 명령을 사용하는 것이 더 유연할 것입니다.

원하는 경우 해당 awk 스크립트를 압축할 수 있습니다.

awk '{if(!($1 in a)||($2=="ca"))a[$1]=$0};END{for(i in a)print a[i]}' data

관련 정보