Оболочка Linux: извлечение значений, разделенных конвейерами, из файла

Обновление до Debian Stretch вернуло как среднюю нагрузку, так и переключение контекста на нормальный уровень.

  • Линукс 4.9.30
  • Апач 2.4.25

К сожалению, я не могу сказать, было ли это обновлением ядра или Apache, которое устранило проблемы, но оно определенно вернулось к норме.

-4
09.06.2019, 20:15
4 ответа

Вы можете считать их все в массив, изменив IFSи сохранить их для будущего использования.....

OIFS=$IFS; IFS='|'; array=($(sed '2q;d' "$filename")); IFS=$OIFS

echo ${array[0]}
Salchipapa

echo ${array[1]}
papa

Таким образом, вы не ограничиваете себя произвольными 10 значениями, а также вам не нужно проверять значение null позже, потому что вы знаете количество элементов в массиве....

echo ${#array[@]}
5

Так ты просто....

for (( i=0; i<${#array[@]}; i++ )); do echo ${array[$i]}; done
Salchipapa
papa
salchicha
aceite
queso
0
28.01.2020, 05:20

Я сделал так, и все заработало:

     for i in {2..10}
     do
        ingName=$(sed -n 2p $filename | cut -d '|' -f $i)
     done

"sed -n 2p $filename" получает вторую строку файла, а затем "cut -d '|' -f $i" дает мне каждый ингредиент, разделенный трубками. число 10 указывает, что существует максимум 10 ингредиентов, поэтому позже в коде я подтверждаю, что работал только тогда, когда переменная ingName не равна нулю.

0
28.01.2020, 05:20

Предполагая, что фактическое содержимое файла

31915
Salchipapa|papa|salchicha|aceite|queso

, тогда вы можете использовать

awk -F '|' 'FNR == 2 { for (i=2; i<=NF; ++i) print $i }' file

для печати полей, начиная со 2-го поля и далее со второй строки, по одному слову на строку вывода.

Следующая команда sedсделает то же самое:

sed '1d;2y/|/\n/;s/[^\n]*\n//' file

Он делает это, удаляя первую строку из ввода, затем изменяет все каналы на новые строки и удаляет до (включая )первую новую строку.

Трубопровод

tail -n 1 file | cut -d '|' -f 2- | tr '|' '\n'

выдаст тот же результат, что и пример данных, выбрав последнюю строку с помощью tail, извлекая поля со второй и далее с помощью cut, а затем изменив все каналы на новые строки.

Вариант вышеизложенного:

tail -n 1 file | tr '|' '\n' | tail -n +2
0
28.01.2020, 05:20

Пробовал с помощью приведенной ниже команды, все работает нормально

awk 'NR==2{print $NF}' filename| awk -F "|" '{$1="";print $0}' |sed -r "s/^\s+//g"| perl -pne "s/ /\n/g"

выход

papa
salchicha
aceite
queso
0
28.01.2020, 05:20

Теги

Похожие вопросы