将制表符分隔的文件行读入数组

jwb*_*ley 59 arrays bash

我想逐行将文件读入脚本.文件中的每一行都是由制表符分隔的多个值,我想将每一行读入一个数组.

典型的bash"逐行读取"示例;

while read line
do
echo $line;
done < "myfile"
Run Code Online (Sandbox Code Playgroud)

对我来说,myfile看起来像这样(制表符分隔值);

value1 value2 value3
value4 value5 value6
Run Code Online (Sandbox Code Playgroud)

在循环的每次迭代中,我希望每一行都进入一个数组,所以我可以

while read line into myArray
do
 echo myArray[0]
 echo myArray[1]
 echo myArray[2]
done < "myfile"
Run Code Online (Sandbox Code Playgroud)

这将在第一次循环迭代中打印以下内容;

value1
value2
value3
Run Code Online (Sandbox Code Playgroud)

然后在第二次迭代它将打印

value4
value5
value6
Run Code Online (Sandbox Code Playgroud)

这可能吗?我能看到的唯一方法是编写一个小函数来手动打破这些值,是否内置了对bash的支持?

rua*_*akh 127

你非常接近:

while IFS=$'\t' read -r -a myArray
do
 echo "${myArray[0]}"
 echo "${myArray[1]}"
 echo "${myArray[2]}"
done < myfile
Run Code Online (Sandbox Code Playgroud)

(-r告诉read\在输入数据中并不特殊;它-a myArray告诉它将输入行分成单词并存储结果myArray;并IFS=$'\t'告诉它只使用制表符来分割单词,而不是常规的Bash默认值也允许空格分割单词.请注意,此方法会将一个或多个制表符视为分隔符,因此如果任何字段为空,则后面的字段将"移位"到数组中的较早位置.这样可以吗?)

  • 这是一个很好的答案,谢谢你这样打破它,我真的很感激.正是我需要的,谢谢:D (6认同)
  • @giorgio79:我能想到的最干净的方法是将整行读入一个变量(例如`IFS = read -r line`),然后使用`readarray`将该变量实质上“拆分”为一个数组:`readarray - d $'\t' -t myArray &lt;&lt;(printf %s "$line")`。(注意:使用 `&lt; &lt;(printf %s "$line")` 而不是 `&lt;&lt;&lt;"$line"` 的原因是后者会附加一个换行符,然后该换行符将包含在最后一个字段中。 ) (2认同)

小智 8

如果你真的想把每个单词(bash含义)拆分成一个不同的数组索引,在每个while循环迭代中完全改变数组,@ ruakh的答案是正确的方法.但是你可以使用读取属性每读字拆分成不同的变量column1,column2,column3在此代码段像

while IFS=$'\t' read -r column1 column2 column3 ; do
  printf "%b\n" "column1<${column1}>"
  printf "%b\n" "column2<${column2}>"
  printf "%b\n" "column3<${column3}>"
done < "myfile"
Run Code Online (Sandbox Code Playgroud)

通过使用有意义的变量名来获得类似的结果,避免数组索引访问并提高代码可读性(当然使用columnN这样做不是一个好主意).