Linux Shell: извлечение значений, разделенных вертикальными чертами, из файла

Linux Shell: извлечение значений, разделенных вертикальными чертами, из файла

У меня в файле есть следующие значения:

line 1: 31915
line 2: Salchipapa|papa|salchicha|aceite|queso

Мне нужно получить значения papa, salchicha, aceite, queso

это значит, что мне нужно получить значения из строки 2, столбца 2.

решение1

Вы можете считать их все в массив, изменив их 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

решение2

Я сделал это так и это сработало:

     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 не равна нулю.

решение3

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

31915
Salchipapa|papa|salchicha|aceite|queso

тогда вы могли бы использовать

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

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

Следующая 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

решение4

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

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

Связанный контент