我想逐行将文件读入脚本.文件中的每一行都是由制表符分隔的多个值,我想将每一行读入一个数组.
典型的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默认值也允许空格分割单词.请注意,此方法会将一个或多个制表符视为分隔符,因此如果任何字段为空,则后面的字段将"移位"到数组中的较早位置.这样可以吗?)
小智 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这样做不是一个好主意).
| 归档时间: |
|
| 查看次数: |
99153 次 |
| 最近记录: |