지정된 열(예제에서 $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
에 있으면 이 used
ID를 이전에 본 적이 있으므로 출력에 입력하면 안 됩니다. 그렇지 않으면 새 ID이므로 값을 연결합니다 out
. 더 이상 사용하지 않으려면 표시되는 요소 집합에 key
" "와 같은 것을 저장합니다.A 3
마지막으로 구성된 목록을 다시 두 번째 열에 넣습니다. 이는 본질적으로 다른 언어에서 취하는 접근 방식입니다.
위 코드를 파일에 넣고 awk -f
또는 작은따옴표를 사용하여 명령줄에서 인수로 모두 실행합니다.
답변2
perl -lpe 's/(\S+)\s+\K\S+/join ",", grep {!$seen{$1}->{$_}++} split ",", $&/e'