将制表符分隔的文件的每一行读入数组中。

27 浏览
0 Comments

将制表符分隔的文件的每一行读入数组中。

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

典型的bash“逐行读取文件”的示例:

while read line
do
echo $line;
done < "myfile"

然而,对我来说,myfile的内容如下(以制表符分隔的值):

value1 value2 value3
value4 value5 value6

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

while read line into myArray
do
 echo myArray[0]
 echo myArray[1]
 echo myArray[2]
done < "myfile"

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

value1
value2
value3

然后在第二次迭代中打印:

value4
value5
value6

这种方法是否可行?我能想到的唯一方法是编写一个小函数手动拆分值,但bash中是否有内置支持呢?

0
0 Comments

从上述内容中可以看出,这个问题的出现原因是使用了不必要的cat命令来读取文件,并且将结果存储在一个字符串变量中。解决方法是直接使用read命令来读取文件的每一行,并将每一行的内容存储在一个数组中。

以下是解决该问题的代码示例:

animals=()
while IFS=$'\t' read -r -a line
do
    animals+=("${line[@]}")
done < animals.txt
for animal in "${animals[@]}"
do
    echo $animal
done

通过上述代码,可以直接使用read命令来读取文件的每一行,并将每一行的内容存储在line数组中。然后,将line数组的内容逐个添加到animals数组中。最后,通过遍历animals数组,可以将每个元素打印出来。

这样就避免了使用不必要的cat命令和字符串变量,提高了代码的效率和可读性。

0
0 Comments

问题的出现原因是需要将一个以制表符分隔的文件的每一行读入到一个数组中。这里提供了两种解决方法。

第一种方法是将值存储在数组中,使用read命令来实现。代码如下:

while IFS=$'\t' read -r user_id username email ; do
  echo "${user_id}"
  echo "${username}"
  echo "${email}"
done < "myfile"

第二种方法是将每个值存储在单独的变量中,这样代码更易读。假设文件的三列分别是用户ID、用户名和电子邮件地址,那么代码如下:

while IFS=$'\t' read -r -a values ; do
  user_id="${values[0]}"
  username="${values[1]}"
  email="${values[2]}"
  echo "${user_id}"
  echo "${username}"
  echo "${email}"
done < "myfile"

对于第一种方法,需要注意的是加上了`-r`选项,这是为了避免反斜杠字符的扩展。如果不加该选项,`printf`格式字符串中的`%b`可能会被替换为`%s`,因为反斜杠转义字符将被表示为字面值。所以根据实际需要来决定是否使用该选项。

0
0 Comments

问题:如何将以制表符分隔的文件的每一行读取到数组中?

原因:希望能够读取以制表符分隔的文件的每一行,并将每个字段存储到数组中。

解决方法:使用read命令结合循环来实现读取文件行,并将每一行以制表符为分隔符存储到数组中。

代码示例:

while IFS=$'\t' read -r -a myArray
do
 echo "${myArray[0]}"
 echo "${myArray[1]}"
 echo "${myArray[2]}"
done < myfile

其中,`-r`选项告诉`read`命令在输入数据中不将反斜杠视为特殊字符;`-a myArray`选项告诉`read`命令将输入行拆分为单词,并将结果存储在`myArray`数组中;`IFS=$'\t'`选项告诉`read`命令只使用制表符作为单词的分隔符,而不是默认的Bash选项,该选项允许使用空格作为单词的分隔符。需要注意的是,这种方法将一个或多个制表符作为分隔符,因此如果某个字段为空,后面的字段将会“移动”到数组中的前面位置。请确认这样处理是否符合需求。

感谢提供这个完美的答案,非常感谢您的解释,我真的非常感激。正是我所需要的,谢谢:D

答案中提到的删除`echo "${myArray[1]}"`和`echo "${myArray[2]}"`的操作不会改变输出结果。

如果在处理geonames数据时,有时会有多个空字段,这意味着多个制表符会被视为一个,从而导致所描述的“移动”问题。如何避免这种情况?可以使用以下方法来解决这个问题,首先将整行读取到一个变量中(例如`IFS= read -r line`),然后使用`readarray`命令将该变量“拆分”为数组:`readarray -d $'\t' -t myArray <<< "$(printf %s "$line")"`。需要注意的是,使用`<<<`而不是`<<<"$line"`的原因是后者会添加一个换行符,然后会包含在最后一个字段中。

如果你有类似但不同的情况,欢迎你提出你自己的问题,并提供足够的细节让其他人来帮助你。如果你在评论中提供你问题的链接,我会去看一下。

0