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
적응이 빠르네요배쉬 솔루션도착하다이 비슷한 질문특정 구분 기호(세미콜론)의 경우:
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