2015-01-30 2 views
2

저는 UNIX와 특히 AWK의 새로운 사용자입니다. 처음 2 열 값을 기반으로 행을 병합하는 데 문제가 있습니다. 아래 파일에서 내 원래 데이터 :AWK/UNIX의 일반 필드를 기반으로 행의 분리 된 필드를 하나로 병합하는 방법

당신이 눈치
Original data content 
======================== 

ID1 ID2 Field1 Field2 
1 1 11F1 11F2 
1 2 12F1 12F2 
2 1 21F1 21F2 
2 2 22F1 22F2 
ID1 ID2 Field3 Field4 
1 1 11F3 11F4 
1 2 12F3 12F4 
2 1 21F3 21F4 
2 2 22F3 22F4 
ID1 ID2 Field5 Field6 
1 1 11F5 11F6 
1 2 12F5 12F6 
2 1 21F5 21F6 
2 2 22F5 22F6 

, 열은 계속 사용할 수 반복 서로 다른 행/블록하지만 ID를 필드와 제목 열로 분할된다. 그래서 내가 원하는 것은 다음과 같습니다 :

ID1 ID2 Field1 Field2 Field3 Field4 Field5 Field6 
1 1 11F1 11F2 11F3 11F4 11F5 11F6 
1 2 12F1 12F2 12F3 12F4 12F5 12F6 
2 1 21F1 21F2 21F3 21F4 21F5 21F6 
2 2 22F1 22F2 22F3 22F4 22F5 22F6 

모두를 단일 블록/테이블로 병합합니다. 그러나 AWK에서이를 수행하는 방법을 모르거나 AWK로 달성 할 수 있습니까?

고맙습니다. Htat 코

+1

을 가진 키'$ 1 ""$ 2' – Barmar

+0

원래'awk' 또는'있는 배열을 확인 도둑질? 펄이나 파이썬은 괜찮습니까? – dawg

답변

3

예, awk를 사용 가능하다 :

awk ' 
{ key = $1 FS $2 } 
!seen[key]++ { keys[++total] = key } 
{ values[key] = (key in values ? values[key] FS $3 FS $4 : $3 FS $4) } 
END { 
    for (cnt=1; cnt<=total; cnt++) 
    print keys[cnt], values[keys[cnt]] 
}' file 
  • 이 출현 순서를 기억하는 배열 seen 사용 키
  • 로서 제 1 및 제 2 열을 형성한다.
  • 키가 배열에 있는지 테스트합니다 (여기서 우리는 3 항 연산을 사용하고 있습니다). 존재하는 경우 기존 값에 새 데이터 세트를 추가하십시오. 값이 없으면 값으로 푸시하십시오.
  • END 블록에서 반복 및 인쇄하십시오.
  • 많은 열이있는 경우 열을 변수에 저장하고 저장하기 전에 키를 제거하십시오.
+1

예쁘다. 문제가 발생하는 유일한 시간은 키 값 중 하나가 데이터 집합 중 하나에서 누락 된 경우입니다 (예 :'1 2 12F5 12F6' 행이 누락 된 경우). 그러나 범위 내에 있는지는 분명하지 않습니다. –

+0

감사합니다. @ 존. 그래 네가 맞아. –

+0

@jaypalsingh 님, 고마워요. –

1

당신은뿐만 아니라 awk는하지 않고이 작업을 수행 할 수 있습니다

$ sort -n data | sed -e 's/ */ /g' | paste - - - -d' ' | cut -d' ' -f 1,2,3,4,7,8,11,12 

출력

ID1 ID2 Field1 Field2 Field3 Field4 Field5 Field6 
1 1 11F1 11F2 11F3 11F4 11F5 11F6 
1 2 12F1 12F2 12F3 12F4 12F5 12F6 
2 1 21F1 21F2 21F3 21F4 21F5 21F6 
2 2 22F1 22F2 22F3 22F4 22F5 22F6 
관련 문제