(키) 열을 기반으로 여러 필드를 개별적으로 결합

(키) 열을 기반으로 여러 필드를 개별적으로 결합

다음과 같이 탭으로 구분된 테스트 데이터가 있습니다.

    A     1     2
    B     3     4
    B     5     6
    C     7     8

다음과 같이 열 1의 중복 값을 기반으로 열 2와 3을 조인(집계)하고 싶습니다.

    A     1     2
    B     3;5   4;6
    C     7     8

이제 여기 솔루션을 기반으로 개발한 작업 코드(열 1을 기준으로 여러 행 병합)는 여러 열의 값을 개별적으로 병합하지 않습니다.

   <test.txt awk -F"\t" '{OFS="\t"} {a[$1]=($1 in a)?a[$1]";"$2FS$3:$1FS$2FS$3} END{for(i in a){print a[i]}}'
    A     1     2
    B     3     4;5 6
    C     7     8

누구든지 내 코드의 오류를 지적하는 데 도움을 줄 수 있다면 매우 감사하겠습니다. 여러 가지 변형을 시도했지만 올바른 형식으로 만들 수 없습니다.

답변1

각 열에 연결된 값을 포함하려면 별도의 변수를 사용하십시오.

awk -F'\t' -v OFS='\t' '{
    if ($1 in a) {
        a[$1] = a[$1]";"$2;
        b[$1] = b[$1]";"$3;
    } else {
        a[$1] = $2;
        b[$1] = $3;
    }
}
END { for (i in a) print i, a[i], b[i] }' < test.txt

답변2

조금 늦었지만 합성 하위 배열을 사용하는 대안은 다음과 같습니다.

awk -v OFS='\t' '{
  if ($1 in arr) {
    split(arr[$1], subArr);
    arr[$1] = subArr[1] ";" $2 OFS subArr[2] ";" $3;
  }
  else {
    arr[$1] = $2 OFS $3
  } }
  END {
    for (i in arr) print i,arr[i];
  }'

관련 정보