첫 번째 탭으로 구분된 패턴을 비교한 후 중복된 줄을 제거하는 코드를 찾고 있습니다.
예: ( ↦
= 탭)
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