使用分隔符分割行并将两个字段存储在不同的变量中

使用分隔符分割行并将两个字段存储在不同的变量中

我有一个包含多行的文本文件。我使用 while 命令逐行读取文件,但我需要将值存储在单独的变量中,并在尾随 shell 脚本中使用它们。

命令分隔整个文件而不是读取的行。

例子my_file.txt

d1:jobid1
id2:jobid2

我正在使用下面的 while 循环逐行读取文件

while IFS= read -r line; do
    jobid=`cut -d: -f2`
    id=`cut -d: -f1`

#remaining shell-script dependent upon variables#

done < my_file.txt

我想存储每一行​​的 jobid 和 idmy_file.txt并运行尾随脚本。每行都是新行

需要帮助以递归方式存储变量中的值。如果有更好的方法来逐行读取并分别分隔和存储两个字段。

答案1

cut默认从标准输入读取。在命令替换中,标准输入继承自循环的标准输入(因为您没有为 的调用提供其他显式输入cut)。循环的标准输入来自您的输入文件。

结果是文件的第一行由 读取read,而所有其他行由第一次调用 读取cut。因此,变量中的值jobid将是换行分隔的作业 ID 字符串,而id变量将为空。该循环将仅运行一次迭代。

可以用, 例如,

id=$( printf '%s\n' "$line" | cut -d: -f1 )

# or: id=$( cut -d: -f1 <<<"$line" )
# (in shells that supports "here-strings")

但这是不必要的,因为这样做会更干净、更有效

while IFS=: read -r id jobid; do
    # code that uses "$id" and "$jobid" goes here
done <my_file.txt

read这利用了可以一次将一行输入的数据读取到多个变量中的事实。通过设置IFS为冒号,该行在冒号上分割,第一个字段被读入,id而其余字段被读入jobidcut根本不需要打电话。

相关内容