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