2014-04-24 3 views
-1

잘 단어를 쓰는 법을 모르겠습니다. 각 행의 첫 번째 열이 색인이되는 입력 파일이 있습니다. 이 입력 파일을 다중 열 출력 파일로 변환하여 각 열의 시작 색인이 일치하도록해야합니다.발생 횟수에 따라 awk 출력 조작

 
1 11.32 12.55 
1 13.32 17.55 
1 56.77 33.22 
2 34.22 1.112 
3 12.13 13.14 
3 12.55 34.55 
3 22.44 12.33 
3 44.32 77.44 

예상 출력해야한다 :

 
1 11.32 12.55 2 34.22 1.112 3 12.13 13.14 
1 13.32 17.55    3 12.55 34.55 
1 56.77 33.22    3 22.44 12.33 
          3 44.32 77.44 

내가 AWK에서이 작업을 수행 할 수있는 쉬운 방법이 있나요

나는 다음과 같은 형식의 입력 파일을 가지고? bash이 같은

답변

2

뭔가 :

paste <(grep '^1 ' input.txt) <(grep '^2 ' input.txt) <(grep '^3 ' input.txt) 

paste는 기본 탭 문자를 사용하지 않거나 게시 프로세스 수있는 탭을 expand로하는 경우 구분 기호를 설정할 수있는 옵션이 있습니다 .. .

편집 : 더 많은 태그를 입력 파일의 경우, 접근 이런 종류의 걸릴 수 :

awk '{print > "/tmp/output" $1 ".txt"}' input.txt 
paste /tmp/output*.txt > final-output.txt 

T 그는 awk 라인은 라인의 첫 번째 필드의 이름을 따서 명명 된 파일에 각 라인을 출력 한 다음 paste을 다시 결합합니다.

EDIT : 아래의 설명에서 지적했듯이 9 개 이상의 중간 파일로 끝나면 문제가 발생할 수 있습니다.

paste /tmp/output[0-9].txt /tmp/output[0-9][0-9].txt > final-output.txt 

당신은 99 개 이상의 파일 ... 또는 999 개 이상의를 가지고 ... 그런 경우, 그래도 python 또는 perl 경우 필요에 따라 추가 인수를 추가 : 그 주위에 한 가지 방법은 다음과 같이 될 것이다 당신이 독립적으로 (열 또는 이런 건간에 항목을 일치하는 줄을 시도하지 않고) 열을 실행하는 데 필요한 모든 후 가장 간단한 해결책이 될 수 있다면 해결책은

+0

위대한 답변 @ twalberg. 하지만 큰 입력 파일이 있습니다. 나는 더 나은 방법으로 그것을 할 수 있습니까? 문법적으로 프로처럼? – Denzil

+0

붙여 넣기 명령에서 glob를 조심하십시오. 첫 번째 필드의 값이 10을 초과하면 올바르게 작동하지 않을 수도 있습니다. –

+0

@EtanReisner 그게 좋은 지적입니다 ... 다른 해킹을 추가하는 중입니다 ... – twalberg

1

... 더 나은 경로 수 있습니다 뭔가 같은 :

awk '{print > $1".OUT"}' FILE; paste 1.OUT 2.OUT 3.OUT 

누락 된 열을 채우지 않으므로 열을 정렬하기 위해 누락 된 열을 채워야합니다. 다음 사용하여 열 너비를 미리 알 (모든 컬럼에 대해 동일) 경우

: 그 공간 컬럼의 폭이 당신이 원하는 걸 얻을해야 있습니다

paste 1.OUT 2.OUT 3.OUT | sed -e 's/^\t/    \t/;s/\t\t/\t    \t/' 

. 좀 더 자동화 된 방식으로이 작업을 수행해야하는 것처럼 느껴지 겠지만 한 사람 만 생각할 수는 없습니다.

+0

하지만 누락 된 열을 채울 공간이 필요합니다. 모든 인덱스의 개수 배열을 유지하려고했습니다. 그러나 그것은 효과가없는 것처럼 보입니다. – Denzil

+0

열 값의 너비가 고정되어 있습니까? –

+0

열의 너비가 고정되어 있습니다. – Denzil