LINUX.ORG.RU

Передать значения в переменные

 ,


0

2

Есть текстовый файл со значениями, разделёнными |. Каждое из 12 значений нужно передать в свою переменную.

Реализовал так:

                1=`head -$cl file.txt | tail -1 | awk -F\| '{print $1}'`
                2=`head -$cl file.txt | tail -1 | awk -F\| '{print $2}'`
                3=`head -$cl file.txt | tail -1 | awk -F\| '{print $3}'`
                4=`head -$cl file.txt | tail -1 | awk -F\| '{print $4}'`
                5=`head -$cl file.txt | tail -1 | awk -F\| '{print $5}'`
                6=`head -$cl file.txt | tail -1 | awk -F\| '{print $6}'`
                7=`head -$cl file.txt | tail -1 | awk -F\| '{print $7}'`
                8=`head -$cl file.txt | tail -1 | awk -F\| '{print $8}'`
                9=`head -$cl file.txt | tail -1 | awk -F\| '{print $9}'`
               10=`head -$cl file.txt | tail -1 | awk -F\| '{print $10}'`
               11=`head -$cl file.txt | tail -1 | awk -F\| '{print $11}'`
               12=`head -$cl file.txt | tail -1 | awk -F\| '{print $12}'`
И всё это в цикле, строк много. Конечно, это работает, но по 12 раз за цикл перечитывать файл - это плохо.

Как это реализовать более красиво?



Последнее исправление: NOPA (всего исправлений: 2)

1=…

2=…

Это аргументы что ли? Они так не присваиваются же.

arr=()
IFS='|' read -r -a arr < <(head -$cl file.txt | tail -1)
set -- "${arr[@]}"
Ну и вместо head -$cl file.txt | tail -1sed -n "$cl{p;q}".

shdown
()
$ cat ./raw
one|two|three|four
111|222|333|444
red|green|blue|black
$
$ cat ./raw | tr '|' ' '  | while read V1 V2 V3 V4; do echo "$V1-$V2-$V3-$V4"; done
one-two-three-four
111-222-333-444
red-green-blue-black
$

не благодари

anonymous
()

Переменная не может иметь имя состоящее или начинающееся с цифр.

IPR ★★★★★
()
Ответ на: комментарий от anonymous

не благодари
anonymous

Ну разве что валенком в морду :-\ Предствим что: $ cat ./raw one|twenty two|three|four

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

anonymous
()
Ответ на: комментарий от mos

mos ★★ (08.07.2015 18:07:49)

Тоже школота?

$ cat data.txt
one|two|three|four
111|222|333|444
red|green|blue|black
TEST!|twenty two| |dude

Ну  и :
$ IFS='|'; while read V1 V2 V3 V4; do echo "$V1-$V2-$V3-$V4"; done < data.txt
one-two-three-four
111-222-333-444
red-green-blue-black
TEST!-twenty two- -dude
и только так!

anonymous
()
Ответ на: комментарий от anonymous

ой илитная щëлочка детектед
кичится своим IFSом который даже на ЛОРе сто раз уже демонстрировали

мой фикс был лишь во славу котов, которых не стоит совать в трубы

mos ★★☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.