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

时间:2011-12-18 07:09:21

标签: bash unix

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

文件1:

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   
...
...

3 个答案:

答案 0 :(得分:29)

您可以通过纯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

答案 1 :(得分:3)

这可能适合你(GNU sed):

sed 'R file2' file1

答案 2 :(得分:0)

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

  1. 在本例中,行号是从其中一个文件中读取的,假设我们在其中一个文件中移动了计数行。行计数器可以手动设置为某个数字,或者循环也可以是“while true”。如果需要,可以使用 sed 代替 Sleep1619523081232 -- sent msg # 1 1619523085287 -- no msgs received --------------- 1619523082233 -- sent msg # 2 1619523085296 -- 1 msgs received 是为了更方便阅读。
<块引用>

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

结果:

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

==> file2 <==
1619523085287 -- no msgs received
  1. 如果您只需要监控 2 个(或更多)文件:
<块引用>

tail -F -n1 file1 file2

结果:

app.get("/api/levelstats",  async function(request, response) {
  response.setHeader('Content-Type', 'application/json');
  if (!request.query.id) return response.send('null');
  let data;
  // change !== to != , maybe you can compare value only and ignore type data
  if (request.query.id != 'all') {
    // if request.query.id is not all, change type data request.query.id from string to int
    data = await db.fetch('60Levelings', {
      target: parseInt(request.query.id)
    });
    data.code = qs.parse(data.code).raw;
    response.send(JSON.stringify(data));
  }
  else {
    data = await db.fetch('60Levelings');
  }