我有一个单列文件,其值如下:
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