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

1 2 3
4 5 6

М2 =

1 5
2 6
3 7
4 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$$"




;;
0
user12179064 14 Окт 2019 в 02:11
Спросите себя: «Какие из команд, которые я знаю до сих пор, предназначены для« распечатки »файла?» Он уже находится в вашем скрипте, вам просто нужно указать правильное имя файла, чтобы оно работало ;-). Удачи.
 – 
shellter
14 Окт 2019 в 02:28
Спасибо! Я вернусь к своему коду и посмотрю, что я могу получить :)
 – 
Andrew White
14 Окт 2019 в 02:31
Я понимаю, как распечатать файл. Мне нужно вызвать аргумент 2 в моем коде, который будет всего лишь 2 доллара, но я поигрался с этим, и я не могу понять, какой из них мне нужен, чтобы дать ему правильный файл для
 – 
Andrew White
14 Окт 2019 в 03:09
1
Рассмотрите возможность обхода вашего кода, по одной строке за раз, вручную выполняя каждую строку в приглашении (linux); каждая команда делает то, что, по вашему мнению, она должна делать?
 – 
markp-fuso
14 Окт 2019 в 03:09
Учитывая файл m1 , похоже, что файл m2 должен начинаться с "1 4" , а не с "1 5" . .
 – 
agc
14 Окт 2019 в 04:18

2 ответа

Вы работали с двумерными массивами? После того, как данные были загружены в массив (например, arr [x, y]), операция «транспонирования» будет просто состоять из цикла по индексам 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[][]) данными из вашего файла; дополнительная подсказка: найдите переменные "NF" и "NR" awk.

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

0
markp-fuso 14 Окт 2019 в 02:52
Ах! Я бы хотел, чтобы мы могли использовать AWK ... мы не можем использовать такие встроенные команды, как эта, ruby ​​и т. Д.
 – 
Andrew White
14 Окт 2019 в 02:53
1
Вы не можете использовать awk, но можете использовать cut, tr и т. Д.? Какое ограничение на то, какие программы можно вызывать из скрипта?
 – 
Shawn
14 Окт 2019 в 03:33
Невозможно использовать awk ruby ​​tcl perl
 – 
Andrew White
14 Окт 2019 в 03:38
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
agc 14 Окт 2019 в 10:05