如何将每一对行的信息合并为一行?

zar*_*ara 4 linux text-processing

我有这样的数据(真实数据有超过 50,000 位数字和 8000 行):

输入:

1 11122
1 21121
2 22221
2 11122
3 21121
3 11122
Run Code Online (Sandbox Code Playgroud)

我想将每个第二行的值放在具有相同名称的第一行的值旁边。此外,每对值之间应该有两个空格作为分隔符,并且不同的值对之间应该有一个制表符作为分隔符。输出应如下所示:

输出:

1   1  2    1  1    1  1    2  2    2  1
2   2  1    2  1    2  1    2  2    1  2
3   2  1    1  1    1  1    2  2    1  2
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?

Mat*_*lis 5

我会使用 perl,并将其作为 oneliner 运行,如下所示:

perl -wne 'sub parseline { ($id,$v) = split; return split //,$v };
    @a = parseline();
    print "$id\t";
    $_ = <>;
    @b = parseline();
    for ($i=0; $i<@a; $i++) {
      print "$a[$i]  $b[$i]\t"
    };
    print "\n"' < input  > output
Run Code Online (Sandbox Code Playgroud)

解释:

  • perl -wne 为每一行输入运行其余的命令
  • sub parseline { .... }将解析输入,并将行中的第一个数字设置为$id,并将其余部分作为字符数组返回。
  • @a=parseline() 将第一行字符存储在数组@a 中
  • 接下来,我们打印$id,然后是 TAB ( \t)
  • $_=<>; @b=parseline(); 将读取下一行(偶数)并将其数据放入数组中 @b
  • for ($i=0; $i<@a; $i++) { print "$a[$i] $b[$i]\t" }对于数组的每个元素@a,我们将打印该元素,两个空格,数组中的对应元素@b,然后是制表符
  • print "\n" 将在最后打印换行符
  • 由于-n参数 toperl在开始时,整个过程将重新开始,从第 3 行开始,然后是第 5 行,然后是第 7 行等等。
  • < input > output 指示我们从哪个文件读取我们的输入,以及我们将输出写入哪个文件。

注意:代码将在每行的末尾打印额外的标签。删除它作为练习留给读者,以防止众包作业并保持代码更简单。此外,该代码假定要配对的行始终是两条又一条(如示例中所示)

当它逐行处理输入文件时,它可以轻松地线性扩展数千行......