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)
有什么建议吗?
我会使用 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 指示我们从哪个文件读取我们的输入,以及我们将输出写入哪个文件。注意:代码将在每行的末尾打印额外的标签。删除它作为练习留给读者,以防止众包作业并保持代码更简单。此外,该代码假定要配对的行始终是两条又一条(如示例中所示)
当它逐行处理输入文件时,它可以轻松地线性扩展数千行......
| 归档时间: |
|
| 查看次数: |
158 次 |
| 最近记录: |