행열 바꾸기...

doodoo의 이미지

어쩌다가 이러한 경우가 생겼습니다.
아래와 같이

1 2 3
4 5 6
7 8 9

행열이 있을때
1 4 7
2 5 8
3 6 9

이렇게 바꾸는 쉘을 짤수 있을까요? 아니면 awk, 혹은 sed 등으로 짤수 있을까요?

액셀에서는 되는데...쉘에서는 방법이 떠오르지 않네요...
PS 실제로는 행열 길이가 매우 길고, 가변이라서 편집기로는 엄두가 나지 않네요...

ymir의 이미지

$ cat run.sh
#!/bin/bash
 
infile=$1
 
declare -a array
 
array=(`cat $infile`)
ncol=`head -1 $infile | wc -w`
nrow=`wc -l $infile | cut -f1 -d' '`
 
for ((i=0; i<ncol; i++))
do
	for ((j=0; j<nrow; j++))
	do
		echo -n ${array[j*ncol+i]}
		echo -n " "  # field separator
	done
	echo "" # new line
done
 
exit 0;
 
$ cat in.txt
a b c d e ff
gg h i j k l
1 2 3 4 5 6
 
$ sh run.sh in.txt
a gg 1 
b h 2 
c i 3 
d j 4 
e k 5 
ff l 6 

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

doodoo의 이미지

헉!
배쉬도 어레이가 되는군요?

declare 문은 좀더 찿아 봐야 겠군요...

감사합니다...C처럼 짜는건 생각 못해봤군요...

lacovnk의 이미지

transpose 로 검색하면 나오네요 :)

rgbi3307의 이미지

#include <stdio.h>
main ()
{
        int arr[3][3] = {
                {1, 2, 3},
                {4, 5, 6},
                {7, 8, 9}
        };
        int *pa;
        int i, j, k;
 
        printf ("\nBefore...\n");
        pa = (int*)arr;
        for (i = 0; i < 9; i++) {
                printf ("%d, ", *pa++);
                if (!((i+1) % 3)) printf ("\n");
        }
 
        printf ("\nAfter...\n");
        pa = (int*)arr;
        k = 0;
        for (i = 0; i < 9; i++) {
                j = i * 3 - k;
                printf ("%d, ", *(pa+j));
                if (!((i+1) % 3)) {
                        printf ("\n");
                        k += 8;
                }
        }
}

실행결과

Before...
1, 2, 3,
4, 5, 6,
7, 8, 9,

After...
1, 4, 7,
2, 5, 8,
3, 6, 9,

From:
*알지비 (메일: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

neocoin의 이미지

ruby 기본 라이브러리 중 matrix 로도..

input.txt

 1 2 3                                                                       
 4 5 6 
 7 8 9

m.rb

#!/usr/bin/env ruby
 require 'matrix'
 
 m = Matrix.rows($<.map{|i|i.split})                                         
 m.transpose.to_a.each{|i| puts i.join(" ")}

usage

(0:8:127)$ ./m.rb < input.txt
1 4 7
2 5 8
3 6 9

다른 라이브러리들이 더 빠르고 좋은거 많을 겁니다. ;;