Bash: использовать столбцы отдельно в массиве

Можно ли разместить столбцы отдельно в массивах, а не как строку, а как столбец. Мне нужно получить доступ к строкам последовательно. У меня есть один файл, но в этом примере файлы делятся на столбцы и используются отдельно.

Пример файла:

column1 column2 column3 444 999 000 555 888 xxx 666 777 xxx 

выходной файл:

 output is 444 bla 999 bla 000 output is 555 bla 888 bla xxx output is 666 bla 777 bla xxx 

Я попробовал следующее bash:

 readarray -t column <firstcolumn.txt for i in "${column1[@]}"; do readarray -t column2 <secondcolumn.txt for j in "${column2[@]}"; do readarray -t column3 <thirdcolumn.txt for k in "${column3[@]}"; do echo "output is $i bla $j bla $k" done done done 

Это простой скрипт, который должен показывать использование readarray . Я держу его более похожим на то, что вы публикуете.

 #!/bin/bash awk '{ print $1 }' data.txt > file_column1.txt awk '{ print $2 }' data.txt > file_column2.txt awk '{ print $3 }' data.txt > file_column3.txt # NLines=` wc -l data.txt | awk '{print $1}'` readarray -t column1 < file_column1.txt readarray -t column2 < file_column2.txt readarray -t column3 < file_column3.txt i=0; for item in "${column1[@]}"; do echo output is ${column1[$i]} bla ${column2[$i]} bla ${column3[$i]}; let "i=i+1" done # rm -f file_column1.txt file_column2.txt file_column3.txt 

Комментарии :

  • С awk вы можете распечатать awk вам столбец ( $1 для $1 -го, $2 -го и $2 -го и так далее). Вы создаете другой файл для каждого столбца.
  • Если раскомментирована строка #Nlines=wc -l | awk '{print $1}' #Nlines=wc -l | awk '{print $1}' может использоваться для подсчета количества строк для вектора, который будет создан после readarray , и сделать цикл по-другому …
  • С readarray вы читаете один файл, и вы помещаете в 1D-вектор.
  • Для каждого компонента 1D векторного столбца 1 выполняется цикл for . Это нужно сделать, принимая каждый вектор, потому что в вашем примере они имеют одинаковый размер. Это должно быть сделано с использованием Nlines .
  • В неиспользуемом item переменной внутри цикла всегда есть одно и то же значение столбца1 [i]
  • Вы получаете доступ непосредственно к компоненту, который Nlines-1 от массива. (Первый индекс равен 0 а последний – Nlines-1 )
  • Вы увеличиваете значение i на каждой итерации цикла for .
  • При необходимости раскомментируйте стирание временных файлов, созданных в скрипте.

Выход

  output is 444 bla 999 bla 000 output is 555 bla 888 bla xxx output is 666 bla 777 bla xxx 

Последний комментарий
Если вы вложите 3 цикла (один внутри другого), вы получите каждую перестановку: не 3, а 3 * 3 * 3 = 27 строк

  0 0 0 0 0 1 0 0 2 0 1 0 ... 

Почему вы не загружаете массивы отдельно от операции, в которой вы их печатаете?

 readarray -t column1 <column1.txt readarray -t column2 <column2.txt readarray -t column3 <column3.txt for (( i=0; i<${#column1[@]}; i++ )); do echo -e "output is ${column1[$i]} bla ${column2[$i]} bla ${column3[$i]}" done 

Я не уверен, что правильно понимаю ваш вопрос, вы, кажется, просите об одном, но ваш результат показывает другое. Чтобы получить желаемый результат, все, что вам нужно, это

 while read col1 col2 col3; do echo "output is $col1 bla $col2 bla $col3" done < file 

Или, чтобы пропустить заголовок:

 tail -n +2 file | while read col1 col2 col3; do echo "output is $col1 bla $col2 bla $col3"; done 

Если вы действительно нуждаетесь в них в массиве, попробуйте что-то вроде

 i=0; while read col1 col2 col3; do col1s[$i]=$col1; col2s[$i]=$col2; col3s[$i]=$col3; let i++; done < <(tail -n +2 file); k=0; for(( k=0; k<i; k++ )); do echo "output is ${col1s[$k]} blah ${col2s[$k]} blah ${col3s[$k]}"; done 
  • LVM без полоски
  • Как восстановить файл, перезаписанный другим в Linux?
  • Как установить Linux вместе с Windows 8 без повреждения конфигурации загрузки Windows 8?
  • Каталог программ, перечисленных в bash
  • Ошибка Putty X11 proxy: авторизация не распознана
  • Как загрузить систему Linux без графического сервера
  • Ноутбук работает спонтанно
  • Управление пакетами на воздушной коробке?
  • Как сделать загрузочный USB с Windows XP liveCD от linux (debian)
  • Создайте много tar-файлов из каталога с 500000 файлами
  • Странный шум при сканировании, используя scanimage и Canon Lide 35
  • Давайте будем гением компьютера.