한 번에 한 열씩 두 파일 병합


12

다음 형식의 2 개의 큰 파일 (3000 열, 15000 행)이 있습니다

file1 (탭으로 구분) :

1/0 0/0 0/0
0/0 1/1 0/0
1/1 0/1 0/0

file2 (탭으로 구분) :

3 5 2
1 7 10
3 4 3

각 파일의 첫 번째 열의 값을 ":"구분 기호와 결합한 다음 두 번째, 세 번째 등의 열로 이동하고 싶습니다. 원하는 출력 (탭으로 구분) :

1/0:3 0/0:5 0/0:2
0/0:1 1/1:7 0/0:10
1/1:3 0/1:4 0/0:3

효율성은 중요하지 않으므로 모든 언어가 좋습니다. 이것이 이전에 요청 된 경우 사과드립니다.

답변:


14

이 같은? 샘플 데이터 작업 :

paste  file{1,2} | awk '{for (i=1;i<=NF/2; i++){printf "%s:%s\t",$i,$(NF/2+i)};printf "\n"}'
1/0:3   0/0:5   0/0:2
0/0:1   1/1:7   0/0:10
1/1:3   0/1:4   0/0:3

2
나는 페이스트를 좋아한다. +1
glenn jackman

충분히 @glennjackman; 응답을 수정하겠습니다.
팅크

예! 완벽하게 일했습니다! 빠른 응답 감사합니다.
존 데 그너

9
awk '{
    getline f2 < "file2"
    split(f2, a)
    for (i=1; i<=NF; i++) 
        printf "%s:%s\t", $i, a[i]
    print ""
}' file1

나는 tink의 응답의 단순함을 선호하지만 완벽하게 작동했습니다.
Jon Degner

1
@JonDegner 그런 다음 해당 답변 (또는이 답변)으로 문제가 해결되면 잠시 후 왼쪽의 확인 표시를 클릭하여 수락하십시오 . 그러면 질문이 답변 된 것으로 표시되며 Stack Exchange 사이트에 감사가 표현되는 방식입니다.
terdon

6

약간 다른 접근법 :

paste -d: <(xargs -n1 <file1) <(xargs -n1 <file2) | xargs -n 3

나는 이것을 찬성했지만, -n 3 부분은 제공된 샘플에서만 작동 한다는 것을 깨달았다 . 실제 데이터를 수용하려면 열 수를 수정해야합니다.
tink

@tink 물론입니다. head -n1 | wc -w그러나 와 같은 방법으로 열 수를 계산할 수 있습니다.
마이클 Vehrs

허. 그것은 당신이 대답하기위한 것이 아니 었습니다. 나는 그 문제를 해결하는 방법을 잘 알고 있습니다 ... 당신의 대답이 덜 찬성해야한다는 설명 일뿐입니다. :}
tink
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.