행열 바꾸기...
글쓴이: doodoo / 작성시간: 수, 2010/10/06 - 2:20오후
어쩌다가 이러한 경우가 생겼습니다.
아래와 같이
1 2 3 4 5 6 7 8 9
행열이 있을때
1 4 7 2 5 8 3 6 9
이렇게 바꾸는 쉘을 짤수 있을까요? 아니면 awk, 혹은 sed 등으로 짤수 있을까요?
액셀에서는 되는데...쉘에서는 방법이 떠오르지 않네요...
PS 실제로는 행열 길이가 매우 길고, 가변이라서 편집기로는 엄두가 나지 않네요...
Forums:


음 ..
$ 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 』
헉! 배쉬도 어레이가
헉!
배쉬도 어레이가 되는군요?
declare 문은 좀더 찿아 봐야 겠군요...
감사합니다...C처럼 짜는건 생각 못해봤군요...
transpose 로 검색하면
transpose 로 검색하면 나오네요 :)
C언어로 코딩해 봤습니다만...
#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/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
생각하기 싫을때는 그냥 라이브러리로...
ruby 기본 라이브러리 중 matrix 로도..
input.txt
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
다른 라이브러리들이 더 빠르고 좋은거 많을 겁니다. ;;
댓글 달기