如何顺序从两个文件中读取一行?

12

我该如何同时每次从两个文件中读取一行?假设我有以下内容的file1和file2:

file1:

line1.a    
line2.a   
line3.a   

文件2:

line1.b   
line2.b   
line3.b   

我该如何获得这样的输出 -

line1.a   
line1.b   
line2.a   
line2.b   
line3.a   
line3.b   
...
...

可能是重复的问题:一次循环中从两个文件读取行 - Sepero
4个回答

32
你可以通过纯粹的bash方式或使用一个叫做paste的工具来完成它: 你的文件:
[jaypal:~/Temp] cat file1
line1.a
line2.a
line3.a
line4.a

[jaypal:~/Temp] cat file2
line1.b
line2.b
line3.b
line4.b

使用文件描述符的纯Bash解决方案:

<&3让Bash读取描述符3处的文件。您应该知道,0、1和2描述符分别用于标准输入、标准输出和标准错误输出。因此,我们应避免使用这些描述符。另外,9之后的描述符由bash内部使用,因此您可以使用从3到9中的任一个描述符。

[jaypal:~/Temp] while read -r a && read -r b <&3; do
> echo -e "$a\n$b";
> done < file1 3<file2
line1.a
line1.b
line2.a
line2.b
line3.a
line3.b
line4.a
line4.b

粘贴工具:

[jaypal:~/Temp] paste -d"\n" file1 file2
line1.a
line1.b
line2.a
line2.b
line3.a
line3.b
line4.a
line4.b

1
“-r” 是什么意思,为什么需要从描述符中读取? - m4l490n

3
这可能对你有用(尽管是GNU sed):
sed 'R file2' file1

0

以防对某人有所帮助。有不同的方法可以实现这一点,以下是两个简单的示例。

  1. 在此示例中,行号从其中一个文件中读取,假定我们在其中一个文件中移动计数行。行计数器可以手动设置为某个数字,或者循环也可以是“while true”。如果需要,可以使用Head -n<N> | tail -n1代替sedSleep用于更方便的阅读。

i=0; k="$(wc -l file1 | awk '{print $1}')"; while [ $i -lt $k ]; do ((i++)); sed -n "$i"p file1; sed -n "$i"p file2; echo "---------------"; sleep 1; done

结果:

1619523081232 -- sent msg # 1
1619523085287 -- no msgs received
---------------
1619523082233 -- sent msg # 2
1619523085296 -- 1 msgs received
  1. 如果您只需要监控2个(或更多)文件:

tail -F -n1 file1 file2

结果:

==> file1 <==
1619523081232 -- sent msg # 1

==> file2 <==
1619523085287 -- no msgs received

0

C#:

string[] lines1 = File.ReadAllLines("file1.txt");
string[] lines2 = File.ReadAllLines("file2.txt");

int i1 = 0;
int i2 = 0;
bool flag = true;

while (i1+i2 < lines1.Length + lines2.Length)
{
    string line = null;
    if (flag && i1 < lines1.Length)
        line = lines1[i1++];
    else if (i2 < lines2.Length)
        line = lines2[i2++];
    else
        line = lines1[i1++];
    flag = !flag;

    Console.WriteLine(line);
}

1
谢谢@k06a。但我正在寻找基于bash的解决方案。 - New User

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接