Bash 脚本 - 逐行读取变量

Bash 脚本 - 逐行读取变量

我有一个单列文件,其值如下:

40 
58
76

我想编写一个脚本来分别读取所有这些值,但我不知道如何通过 Bash 脚本来做到这一点。

我想要回声显示如下内容:

LINE 1 : value 40
LINE 2 : value 58
LINE 3 : value 76

答案1

对于这样的事情,你可以使用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这将使用以while为参数的循环来循环遍历文件的内容< file。每次循环,一行的值都会存储在变量 中$value。然后,只需打印结果并增加变量$line以跟踪行号即可。

在 BashFAQ 中查看更多信息:如何逐行(和/或逐字段)读取文件(数据流、变量)?

答案2

通过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

答案3

尝试这个 Bash 循环:

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

答案4

您可以在 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

要使用该格式逐个打印数组的元素,可以使用循环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

相关内容