An efficient way to transpose a file in Bash

前端 未结 29 2083
时光说笑
时光说笑 2020-11-22 03:30

I have a huge tab-separated file formatted like this

X column1 column2 column3
row1 0 1 2
row2 3 4 5
row3 6 7 8
row4 9 10 11

I would like t

29条回答
  •  清酒与你
    2020-11-22 03:55

    I was just looking for similar bash tranpose but with support for padding. Here is the script I wrote based on fgm's solution, that seem to work. If it can be of help...

    #!/bin/bash 
    declare -a array=( )                      # we build a 1-D-array
    declare -a ncols=( )                      # we build a 1-D-array containing number of elements of each row
    
    SEPARATOR="\t";
    PADDING="";
    MAXROWS=0;
    index=0
    indexCol=0
    while read -a line; do
        ncols[$indexCol]=${#line[@]};
    ((indexCol++))
    if [ ${#line[@]} -gt ${MAXROWS} ]
        then
             MAXROWS=${#line[@]}
        fi    
        for (( COUNTER=0; COUNTER<${#line[@]}; COUNTER++ )); do
            array[$index]=${line[$COUNTER]}
            ((index++))
    
        done
    done < "$1"
    
    for (( ROW = 0; ROW < MAXROWS; ROW++ )); do
      COUNTER=$ROW;
      for (( indexCol=0; indexCol < ${#ncols[@]}; indexCol++ )); do
    if [ $ROW -ge ${ncols[indexCol]} ]
        then
          printf $PADDING
        else
      printf "%s" ${array[$COUNTER]}
    fi
    if [ $((indexCol+1)) -lt ${#ncols[@]} ]
    then
      printf $SEPARATOR
        fi
        COUNTER=$(( COUNTER + ncols[indexCol] ))
      done
      printf "\n" 
    done
    

提交回复
热议问题