Сценарии Bash - Чтение переменных линию за линией

У меня есть файл отдельного столбца со значениями как:

40 
58
76

Я хочу сделать сценарий для чтения отдельно, все это оценивает, но я не знаю способы сделать это с помощью сценария Bash.

Я хочу дисплей эха что-то вроде этого:

LINE 1 : value 40
LINE 2 : value 58
LINE 3 : value 76
3
задан 20 October 2015 в 14:48

4 ответа

Через awk

awk '{printf "%s%s%s%s\n","LINE ",NR," : value ",$1}' foo
<час>

Пример

$ cat foo
40 
58
76

$ awk '{printf "%s%s%s%s\n","LINE ",NR," : value ",$1}' foo
LINE 1 : value 40
LINE 2 : value 58
LINE 3 : value 76
1
ответ дан 1 December 2019 в 13:09

попробуйте эту петлю Удара:

while read -r line; do let lineNumber++; echo "LINE $lineNumber : value $line"; done < file.txt

продукция:

LINE 1 : value 40
LINE 2 : value 58
LINE 3 : value 76
0
ответ дан 1 December 2019 в 13:09

Для вещей как это можно использовать awk:

$ awk '{print "LINE", NR, ": value", $0}' file
LINE 1 : value 40
LINE 2 : value 58
LINE 3 : value 76

awk автоматически чтения одна строка в то время. NR содержит номер строки и $0 полное содержание строки, таким образом, просто необходимо распечатать их.

Но если Вы действительно хотите Bash, говорите что-то как:

line=1
while IFS= read -r value; do
  echo "LINE $line : value $value"
  (( line ++ ))
done < file

Это циклично выполняется через содержание файла file использование a while цикл, который питается < file. Каждый цикл, значение одной строки хранится в переменной $value. Затем это - вопрос печати результата вместе с постепенным увеличением переменной $line отслеживать номер строки.

Посмотрите больше информации в BashFAQ: Как я могу считать файл (поток данных, переменная) линию за линией (и/или поле полем)?.

9
ответ дан 1 December 2019 в 13:09

Можно сделать это исходно в Bash> 4 использования mapfile / readarray встроенный:

mapfile -t x <in
$ cat in
40 
58
76
$ mapfile -t x <in
$ echo ${x[@]}
40 58 76
$ echo ${x[0]}
40
$ echo ${x[1]}
58
$ echo ${x[2]}
76

Для печати элементов массива один за другим с помощью того формата можно использовать a for цикл:

i=1; for element in ${x[@]}; do echo "LINE $i : value $element"; ((i++)); done
$ i=1; for element in ${x[@]}; do echo "LINE $i : value $element"; ((i++)); done
LINE 1 : value 40
LINE 2 : value 58
LINE 3 : value 76
0
ответ дан 1 December 2019 в 13:09

Другие вопросы по тегам:

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