如何顺序读取2个文件中的1行?

发布于 2024-12-21 21:31:41 字数 356 浏览 0 评论 0原文

如何一次读取 2 个文件 1 行?假设我的 file1 和 file2 包含以下内容:

file1:

line1.a    
line2.a   
line3.a   

file2:

line1.b   
line2.b   
line3.b   

我如何获得这样的输出 -

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

How do I read from 2 files 1 line at a time? Say if I have file1 and file2 with following content:

file1:

line1.a    
line2.a   
line3.a   

file2:

line1.b   
line2.b   
line3.b   

How do I get output like this -

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

耳根太软 2024-12-28 21:31:41

您可以通过纯 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 处的文件。您会知道 Stdin、Stdout 和 Stderr 使用 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

You can do it either via a pure bash way or by using a tool called paste:

Your files:

[jaypal:~/Temp] cat file1
line1.a
line2.a
line3.a
line4.a

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

Pure Bash Solution using file descriptors:

<&3 tells bash to read a file at descriptor 3. You would be aware that 0, 1 and 2 descriptors are used by Stdin, Stdout and Stderr. So we should avoid using those. Also, descriptors after 9 are used by bash internally so you can use any one from 3 to 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

Paste Utility:

[jaypal:~/Temp] paste -d"\n" file1 file2
line1.a
line1.b
line2.a
line2.b
line3.a
line3.b
line4.a
line4.b
只有影子陪我不离不弃 2024-12-28 21:31:41

这可能对你有用(尽管是 GNU sed):

sed 'R file2' file1

This might work for you (GNU sed though):

sed 'R file2' file1
属性 2024-12-28 21:31:41

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);
}

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);
}
戒ㄋ 2024-12-28 21:31:41

以防万一它可能对某人有帮助。实现这一目标的方法有多种,这里有两个简单的例子。

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

i=0; k="$(wc -l file1 | awk '{print $1}')"; while [ $i -lt $k ];做((i++)); sed -n "$i"p 文件1; sed -n "$i"p 文件2;回声“----------------”;睡觉1;完成

结果:

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

tail -F -n1 文件1 文件2

结果:

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

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

Just in case it might be helpful to somebody. Different ways to achieve this, here are 2 simple examples.

  1. In this example the lines number is read from one of the files, it is assumed that we move counting lines in one of the files. Lines counter can be set manually to some number, or the loop can be "while true" as well. Head -n<N> | tail -n1 can be used instead of sed if needed.
    Sleep is put for more convenient reading.

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

Result:

1619523081232 -- sent msg # 1
1619523085287 -- no msgs received
---------------
1619523082233 -- sent msg # 2
1619523085296 -- 1 msgs received
  1. If you just need to monitore 2 (or more) files:

tail -F -n1 file1 file2

Result:

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

==> file2 <==
1619523085287 -- no msgs received
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文