使用分隔符號分割行並將兩個欄位儲存在不同的變數中

使用分隔符號分割行並將兩個欄位儲存在不同的變數中

我有一個包含多行的文字檔。我使用 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根本不需要打電話。

相關內容