간단한 스크립트 전치 테이블

간단한 스크립트 전치 테이블

CSV 테이블을 바꾸는 스크립트를 작성하려고 합니다. 나는 몇 가지 파일을 가지고 있습니다 :

head1;head2;head3
field11;field12;field13
field21;field22;field23

(등등.) 그리고 나는 원한다

head1;field11;field21
head2;field12;field22
head3;field13;field23

나는 그것이 어떻게 이루어질 수 있는지 전혀 모릅니다. 나는 당신에게 스크립트 작성을 요구하지 않습니다. 표준 쉘에서 어떻게 만들 수 있는지에 대한 아이디어가 필요합니다. (불행히도 나는 bashism이나 GNU 확장을 사용할 수 없습니다. POSIX만 사용할 수 있습니다.)

추신. 사실, 나는 그것을 할 수 있지만, 추악하고 비효율적인 방법으로만 가능합니다. 나는 더 아름다운 방법이 있다고 믿습니다.

답변1

데이터 전치

head1;head2;head3
field11;field12;field13
field21;field22;field23
field31;field32;field33

GNU로 할 수 있습니다 datamash:

$ datamash -t ';' transpose <file
head1;field11;field21;field31
head2;field12;field22;field32
head3;field13;field23;field33

답변2

다음은 빠른 적응입니다.배쉬 솔루션에게이 비슷한 SO 질문사용 중인 특정 구분 기호(세미콜론)의 경우:

declare -a array=( )                      # we build a 1-D-array

IFS=';' read -a line < "$1"                       # read the headline

COLS=${#line[@]}                          # save number of columns

index=0
while IFS=';' read -a line ; do
    for (( COUNTER=0; COUNTER<${#line[@]}; COUNTER++ )); do
        array[$index]=${line[$COUNTER]}
        ((index++))
    done
done < "$1"

for (( ROW = 0; ROW < COLS; ROW++ )); do
  printf "%s" ${array[$ROW]}
  for (( COUNTER = ROW+COLS; COUNTER < ${#array[@]}; COUNTER += COLS )); do
    printf ";%s" ${array[$COUNTER]}
  done
  printf "\n" 
done

답변3

데이터는 세미콜론으로 구분됩니다(CSV 아님). 따라서 다음 코드를 시도해 볼 수 있습니다.

awk -F';' '{OFS=";"}{ for (i=1; i<=NF; i++) a[i]= (i in a?a[i] OFS :"") $i; } 
    END{ for (i=1; i<=NF; i++) print a[i] }' input.txt

head1;field11;field21;field31
head2;field12;field22;field32
head3;field13;field23;field33

답변4

flds=3; for((i=1;i<=flds;i++));do
  printf '%s' "$(cut -d';' -f$i file)" |tr '\n' ';';echo
done

관련 정보