从文件读取输入并使用 shell 将值附加到变量

从文件读取输入并使用 shell 将值附加到变量

我正在尝试编写一个 bash 脚本来读取文件作为输入并将该文件中的值/数据附加到变量中,并且应根据文件中的输入行在每次迭代中更新变量的值。

例如:输入文件如下所示:

100  Thomas  Manager    Sales       $5,000
200  Jason   Developer  Technology  $5,500
300  Sanjay  Sysadmin   Technology  $7,000
400  Nisha   Manager    Marketing   $9,500
500  Randy   DBA        Technology  $6,000

当我通过我的 shell 脚本读取此内容时,我将定义 5 个变量,分别为 a、b、c、d、e。

第一次迭代:

变量值应与输入文件的第一行一起分配。

a=100
b=Thomas
c=Manager
d=Sales
e=$5000

第二次迭代:

变量值应与输入文件的第二行一起分配。

a=200
b=Jason
c=Developer
d=Technology
e=$5500

等等...

请任何人提供一些关于如何编写脚本来读取这种格式的值的建议。

答案1

您可以使用read内置命令带有-a循环选项,用于将文件的每一行读取为数组。然后,您可以将数组元素的值分配给所需的变量(或者您可以在脚本中直接使用数组元素):

#!/bin/bash

IN_FILE='./in-file.txt'

while read -ra LINE
do
        a="${LINE[0]}"; b="${LINE[1]}"; c="${LINE[2]}"
        d="${LINE[3]}"; e="${LINE[4]}"

        echo -e "$a\n$b\n$c\n$d\n$e\n"

done < "$IN_FILE"

另一种方法是将某一行的每一列的值直接分配给变量。以下示例使用 bash 函数,该函数将为变量提供新的调用时的值。该函数有一个输入参数,用于确定要解析文件中的哪一行。

#!/bin/bash

IN_FILE='./in-file.txt'

args_feed() {
        read -r a b c d e <<< "$(sed "$1 q;d" "$IN_FILE")"
}

# -----------------
# Examples of usage
# -----------------

# Parse the third line
args_feed 3
echo -e "$a\n$b\n$c\n$d\n$e\n"


# Sequential call - First iteration
args_feed $((++LINE_NR))
echo -e "$a\n$b\n$c\n$d\n$e\n"

# Sequential call - Second iteration
args_feed $((++LINE_NR))
echo -e "$a\n$b\n$c\n$d\n$e\n"


# Parse the entire file
NR_LINES="$(cat "$IN_FILE" | wc -l)"
for LINE_NR in $(seq 1 $NR_LINES)
do
        args_feed "$LINE_NR"
        echo -e "$a\n$b\n$c\n$d\n$e\n"
done

笔记:

相关内容