如何在单个循环的每次迭代中从每个文件中读取一行?

时间:2013-05-20 07:31:04

标签: bash

我需要在一个循环中读取多个文件。我有一个带有X坐标的文件,一个带有Y坐标的文件和一个带有这些坐标上的字符的文件。

现在我使用paste将这些文件放在一起,然后在while循环中使用cut将它们分开:

paste x-file y-file char-file | while -r line; do
    Y=$(echo "$line" | cut -d\  -f1)
    X=$(echo "$line" | cut -d\  -f2)
    CHAR=$(echo "$line" | cut -d\  -f3)
done

但问题是它真的慢(一次又一次地调用cut)。

我应该怎样做才能在$Y$X$CHAR中的每个循环中获得正确的值,同时加快速度?

2 个答案:

答案 0 :(得分:7)

您可以从不同的文件描述符中调用read三次。

# Use && to stop reading once the shortest file is consumed
while read -u 3 -r X &&
      read -u 4 -r Y &&
      read -u 5 -r CHAR; do
    ...
done 3< X.txt 4< Y.txt 5< CHAR.txt 

-u是一个bash扩展名,用于清晰。对于POSIX兼容性,每个调用看起来都像read -r X <&3。)

答案 1 :(得分:4)

我不确定如何在没有paste的情况下执行此操作,但您可以避免cut在一个read中分配所有变量:

while read -r X Y CHAR; do
    echo "X = $X; Y = $Y; CHAR = $CHAR";
done < "$file"