2013-09-28 2 views
1

awk 또는 bash을 사용하여 확실하게 해결할 수있는 약간의 데이터 조작 문제가 있습니다.awk/bash : 파일에 열을 반복적으로 추가합니다.

두 개의 기존 데이터 파일이 있습니다. 첫 번째는 탭으로 구분 된 필드로 구성되며 n 개의 블록으로 배열됩니다. 각 블록은 하나의 공백 행으로 구분됩니다.

1 3 
2 4 
3 5 

4 6 
5 7 
6 8 

두 번째 파일에는 첫 번째 파일의 모든 블록만큼 긴 데이터 열 하나만 있습니다. 당신이 어떤 생각을 가지고 있습니까

1 3 a 
2 4 b 
3 5 c 

4 6 a 
5 7 b 
6 8 c 

:

a 
b 
c 

내 문제

출력의 모습 있도록, 내가 파일 하나에 모든 블록에 파일이있는 데이터 열을 추가해야한다는 것입니다? 나는 이미 새로운 파일에 2 번 n-times (블록 수)의 데이터를 쓰고이 파일에 awk을 붙이려고했지만 제대로 작동하지 않았다.

답변

1

저장 데이터와 첫번째 파일의 각 행에 대한 콘텐츠에 대한 순환 배열 사용 모듈 연산자 (%)에서 두 번째 파일의 각 라인 :

awk ' 
    BEGIN { FS = OFS = "\t" } 
    FNR == NR { data[ NR - 1 ] = $0; next } 
    ! $0 { print; next } 
    { ++i; print $0, data[ (i - 1) % 3 ] } 
' file2 file1 

그것은 산출 :

1 3 a 
2 4 b 
3 5 c 

4 6 a 
5 7 b 
6 8 c 
0

a.dat, b.dat 두 개의 파일이 있다고 가정하면이 작업을 수행 할 수 있습니다.

cat -n a.dat > aa.dat 
cat -n b.dat > bb.dat 
join aa.dat bb.dat | awk '{$1=""}1' > c.dat 
rm aa.dat bb.dat 

결과는 c.dat에 저장됩니다. awk '{$1=""}1'은 줄 번호 인 첫 번째 열을 제거합니다.

+0

이는 영업 이익의 문제가 해결되지 않습니다. –

2

이 간단한 동적 하나 라이너 트릭을 할 것입니다 :

awk 'NR==FNR{a[i++]=$0;next}{print (NF?$0 OFS a[j++%i]:$0)}' OFS='\t' file2 file1 
1 3 a 
2 4 b 
3 5 c 

4 6 a 
5 7 b 
6 8 c