2017-11-28 4 views
0

첫 번째 필드의 값을 기반으로 열을 병합하려고합니다. 나는 awk를 사용해 보았지만 아무 소용이 없었다. 입력 및 출력 예제를 참조하십시오.필드 값을 기반으로 행 병합

Input: 
10013 97  1503384 
10013 196  1506234 
10013 61  1507385 
10013 1559 1508385 
10014 1726 1514507 
10014 960  1519162 
10015 1920 1545535 
10015 124  1548915 
10015 77  1550284 

Desired_Output: 
10013 97,196,61,1559 1503384,1506234,1507385,1508385 
10014 1726,960  1514507,1519162 
10015 1920,124,77  1545535,1548915,1550284 

미리 조언 해 주셔서 감사합니다.

+3

여러분의 입력 및 스크립트에 코드 태그를 사용하십시오. – RavinderSingh13

+1

원하는대로 작동하지 않더라도 항상 스크립트를 게시하는 데 도움이됩니다. – karakfa

답변

2

최단 GNU datamash 용액 :

datamash -sW -g1 collapse 2 collapse 3 <file 
  • -g1 - 1 필드에 의한 그룹
  • collapse N - 각 그룹 내의 필드 N 모든 입력 값 쉼표로 구분 제조 작업

,

출력 :

10013 97,196,61,1559 1503384,1506234,1507385,1508385 
10014 1726,960 1514507,1519162 
10015 1920,124,77 1545535,1548915,1550284 
+0

이것은 이러한 종류의 작업에 매우 유용한 도구처럼 보입니다. – karakfa

+0

@karakfa, 간단한 그룹화/집계 및 산술 연산에 매우 편리합니다. "stuff"권장 – RomanPerekhrest

+0

가장 최신 버전인지 확인하십시오. 모든 배포 리포지토리가 최신 버전이 아닙니다. 그들의 [dowload 페이지] (https://www.gnu.org/software/datamash/download/)를보십시오. – vaettchen

0

Awk 용액 (입력 선이 이미 분류되어 있다고 가정)

awk '!a[$1]++{ if ("f2" in b) { print f1, b["f2"], b["f3"]; delete b } } 
    { 
     f1=$1; 
     b["f2"]=(b["f2"]!=""? b["f2"]",":"")$2; 
     b["f3"]=(b["f3"]!=""? b["f3"]",":"")$3 
    } 
    END{ print f1, b["f2"], b["f3"] }' OFS='\t file 
  • delete b - 액션에 우리에서 배열 b 방지합니다 처리 중에 모든 값을 유지합니다 (메모리 절약). 그것은 각각의 고유 한 첫번째 필드 값

에 삭제됩니다 출력 : 구조에

10013 97,196,61,1559 1503384,1506234,1507385,1508385 
10014 1726,960 1514507,1519162 
10015 1920,124,77 1545535,1548915,1550284 
0

awk!

$ awk '{f2[$1]=f2[$1] sep[$1] $2;     # concatenate 2nd field 
     f3[$1]=f3[$1] sep[$1] $3;     # concatenate 3rd field 
     sep[$1]=","}        # lazy init separator to skip first 
    END {for(k in f2) print k,f2[k],f3[k]}' file | # iterate over keys and print 
    column -t           # pretty print 


10013 97,196,61,1559 1503384,1506234,1507385,1508385 
10014 1726,960  1514507,1519162 
10015 1920,124,77  1545535,1548915,1550284 

출력 순서가 보장되지 않지만 첫 번째 필드로 정렬 할 수 있습니다.

0
$ cat tst.awk 
$1 != f1 { if (NR>1) print f1, f2, f3; f1=f2=f3=s="" } 
{ f1=$1; f2=f2 s $2; f3=f3 s $3; s="," } 
END { print f1, f2, f3 } 

$ awk -f tst.awk file | column -t 
10013 97,196,61,1559 1503384,1506234,1507385,1508385 
10014 1726,960  1514507,1519162 
10015 1920,124,77  1545535,1548915,1550284 
관련 문제