我希望你帮助我通过以下方式来组织我的数据。我的输入数据如下。
输入文件:
1 2 1 0.6007 0.1 0.3 0.2 0.7 0.7 0 2 0.3073 0.1 0.1 0.2 0.4 0.7 0.5
2 2 1 0.4022 0.1 0.3 0.2 0.7 0.7 0 2 0.5085 0.1 0.1 0.2 0.4 0.7 0.5
3 2 1 0.0029 0.1 0.3 0.2 0.7 0.7 0 2 0.9078 0.1 0.1 0.2 0.4 0.7 0.5
4 2 1 0.0692 0.1 0.3 0.2 0.7 0.7 0 2 0.8805 0.1 0.1 0.2 0.4 0.7 0.5
我想要的输出文件如下所示:
输出文件:
1 2
0.6007 1 0.1 0.3 0.2 0.7 0.7 0
0.3073 2 0.1 0.1 0.2 0.4 0.7 0.5
2 2
0.4022 1 0.1 0.3 0.2 0.7 0.7 0
0.5085 2 0.1 0.1 0.2 0.4 0.7 0.5
3 2
0.0029 1 0.1 0.3 0.2 0.7 0.7 0
0.9078 2 0.1 0.1 0.2 0.4 0.7 0.5
4 2
0.0692 1 0.1 0.3 0.2 0.7 0.7 0
0.8805 2 0.1 0.1 0.2 0.4 0.7 0.5
答案1
我们又来了 slm :)
Perl 中的类似机制,从命令行:
perl -ane 'print "$F[0] $F[1]\n $F[3] $F[2] @F[4..9]\n" .
" $F[11] $F[10] @F[12..17]\n"' inputfile
-n
inputfile
将 的每一行作为循环处理。-a
围绕字段分隔符(默认为空格)分割每一行,并将其分配给特殊数组@F
,并将-e
它们传递给指定的 perl 命令(该命令只是按照所需的顺序打印元素,并在需要时使用空格和换行符)。
将其放入 perl 脚本文件中:
#! /usr/bin/perl -an
print "$F[0] $F[1]\n $F[3] $F[2] @F[4..9]\n" .
" $F[11] $F[10] @F[12..17]\n";
Chmod 文件 ( chmod u+x perlscript
),然后只需运行./perlscript inputfile
.
如果您需要将输出放在不同的文件中,只需将其放在> outputfile
命令末尾(这与直接在命令行上使用的第一个示例相同)
./perlscript inputfile > outputfile
答案2
这是使用的暴力方式awk
:
$ awk '
{print $1" "$2}
{print "\t"$4" "$3" "$5,$6,$7,$8,$9,$10}
{print "\t"$12" "$11" "$13,$14,$15,$16,$17,$18}
' input.file
1 2
0.6007 1 0.1 0.3 0.2 0.7 0.7 0
0.3073 2 0.1 0.1 0.2 0.4 0.7 0.5
2 2
0.4022 1 0.1 0.3 0.2 0.7 0.7 0
0.5085 2 0.1 0.1 0.2 0.4 0.7 0.5
3 2
0.0029 1 0.1 0.3 0.2 0.7 0.7 0
0.9078 2 0.1 0.1 0.2 0.4 0.7 0.5
4 2
0.0692 1 0.1 0.3 0.2 0.7 0.7 0
0.8805 2 0.1 0.1 0.2 0.4 0.7 0.5
这是一个稍微更紧凑的版本,它使用 for 循环来执行串联的列:
$ awk '
{print $1" "$2}
{printf("\t%s %s ",$4,$3)}
{for(i=5;i<=10;i++)printf("%s ",$i);print ""}
{printf("\t%s %s ",$12,$11)}
{for(i=13;i<=18;i++)printf("%s ",$i);print ""}
' input.file