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

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

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

예: ( = 탭)

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 스크립트는 작동합니다.

중복 파일 제거

#!/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

관련 정보