Bash: использовать столбцы отдельно в массиве
Можно ли разместить столбцы отдельно в массивах, а не как строку, а как столбец. Мне нужно получить доступ к строкам последовательно. У меня есть один файл, но в этом примере файлы делятся на столбцы и используются отдельно.
Пример файла:
column1 column2 column3 444 999 000 555 888 xxx 666 777 xxx
выходной файл:
- Как преднамеренно ввести задержку для входящих пакетов UDP
- Можно ли заставить SSH передавать пустые аргументы?
- Есть ли «chmod 777. * -R» родительские каталоги chmod (..)?
- Являются ли размеры страницы памяти и размер кластера файловой системы одинаковыми?
- Как «отлаживать» клавиатуру в Linux? Как нажатие клавиши и просмотр кода в терминале
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
- Инструмент, такой как Media Segmenter для Linux
- Возможно ли «вернуться» в GRUB после загрузки Linux без перезагрузки
- Как установить том LVM?
- Альтернатива для «tail -f», которая следует за именем файла
- Выключатель kill OpenVPN не работает
- Настройка IPv6 на Debian - глобальный временный адрес
- Возможно ли регистрировать события файловой системы в Windows или Linux?
- Переход в каталог с использованием переменных bash не работает, если имена каталогов имеют пробелы
Это простой скрипт, который должен показывать использование 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