Скрипт Bash Shell, транспонирующий матрицу, не печатает - PullRequest
0 голосов
/ 14 октября 2019

Я пишу скрипт оболочки bash, который должен делать несколько вещей. Функция, над которой я сейчас работаю, нуждается в транспонировании матрицы, которая в данном случае представляет собой просто текстовый файл со строками и столбцами. У меня есть два файла, которые я называю m1 и m2 ... Текстовый файл m1 это просто:

1 2 34 5 6

м2 =

1 52 63 74 8

Так что по сути мне нужно превратить m2 в m1 и m1 в m2. Вот мой код, который я получил в основном из лекции по транспозиции, которая очень помогла. В настоящее время он ничего не печатает, но все еще работает и не имеет ошибок во время выполнения.

Вот мой код:

transpose)

inputFile="tempinputfile"
tempCol="tempcolfile"
tempRow="temprowfile"


echo -e "1\t2\t3\t4\t5" > $inputFile

cut -c 1 $inputFile > $tempCol
cut -c 3 $inputFile >> $tempCol
cut -c 5 $inputFile >> $tempCol
cut -c 7 $inputFile >> $tempCol
cut -c 9 $inputFile >> $tempCol

cat $tempCol | tr '\n' '\t' > "$tempRow$$"

echo >> "$tempRow$$"




;;

Ответы [ 2 ]

0 голосов
/ 14 октября 2019
awk '{ for (i=1; i<=NF; i++) a[i]=(a[i]? a[i] FS $i: $i) } END{ for (i in a) print a[i] }' file.txt
0 голосов
/ 14 октября 2019

Вы работали с 2-мерными массивами? После того, как данные были загружены в массив (например, arr [x, y]), операция «transpose» будет просто состоять из циклического перемещения по индексам y и x.

Я нахожу массивы в awk длябыть немного легче работать с массивами в bash;Вот подсказка awk:

awk '

BEGIN { arr[1][1]="a" ; arr[1][2]="b"
        arr[2][1]="c" ; arr[2][2]="d"
      }

END { printf "+++++++++++ as is\n"
      for (x in arr)
          { for (y in arr[x])
                { printf "%s ",arr[x][y] }
            printf "\n"
          }
      printf "+++++++++++ transposed\n"
      for (x in arr)
          { for (y in arr[x])
                { printf "%s ",arr[y][x] }
            printf "\n"
          }
      printf "+++++++++++\n"
    }
' m1

+++++++++++ as is
a b
c d
+++++++++++ transposed
a c
b d
+++++++++++

В вашем случае вы захотите заменить весь блок BEGIN кодом, который заполняет массив (arr[][]) данными из вашего файла;дополнительный совет: найдите переменные awk 'NF' и 'NR'.

Решение на основе awk имеет дополнительное преимущество, заключающееся в том, что оно сканирует входной файл только один раз;и поскольку файловый ввод-вывод влечет за собой (относительную) высокую нагрузку, чем меньше времени вам придется обрабатывать файл, тем быстрее будет выполняться ваш код.

...