특정 열의 중복 필드 제거(ID 확인 후)

특정 열의 중복 필드 제거(ID 확인 후)

지정된 열(예제에서 $2)에서 중복 필드(쉼표로 구분)를 제거하고 싶지만 ID 열(예제에서 $1)이 동일한 경우에만 가능합니다.

입력하다:

A    1,2,3,4
A    8,9,10,11
A    2,3,4,11,12
B    4,5,6,7
B    6,8,9,10

예상 출력:

A    1,2,3,4
A    8,9,10,11
A    12
B    4,5,6,7
B    8,9,10

답변1

awk사용하기 쉽습니다대량으로,나뉘다, 뿐만 아니라 정규반지:

{
    split($2, elements, ",")
    out = ""
    for (i in elements) {
        el = elements[i]
        key = $1 " " el
        if (!(key in used)) {
            out = out el ","
        }
        used[key] = 1
    }
    sub(/,$/, "", out)
    $2 = out
}
1

각 행에 대해 두 번째 열을 쉼표로 구분하고 비트를 배열에 저장합니다 elements. 그런 다음 루프를 사용하여 해당 열에 대한 새 값을 작성하고 이전에 해당 값을 본 적이 있는지 확인합니다.

(연관) 배열에서 이미 본 값 세트를 유지합니다 used. key현재 보고 있는 첫 번째 열의 값과 두 번째 열의 값을 포함하는 문자열을 구성합니다 . key에 있으면 이 usedID를 이전에 본 적이 있으므로 출력에 입력하면 안 됩니다. 그렇지 않으면 새 ID이므로 값을 연결합니다 out. 더 이상 사용하지 않으려면 표시되는 요소 집합에 key" "와 같은 것을 저장합니다.A 3

마지막으로 구성된 목록을 다시 두 번째 열에 넣습니다. 이는 본질적으로 다른 언어에서 취하는 접근 방식입니다.

위 코드를 파일에 넣고 awk -f또는 작은따옴표를 사용하여 명령줄에서 인수로 모두 실행합니다.

답변2

perl -lpe 's/(\S+)\s+\K\S+/join ",", grep {!$seen{$1}->{$_}++} split ",", $&/e'

관련 정보