如何选择行的一部分并粘贴以形成其他文件?

如何选择行的一部分并粘贴以形成其他文件?

我希望你帮助我通过以下方式来组织我的数据。我的输入数据如下。

输入文件:

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

-ninputfile将 的每一行作为循环处理。-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

相关内容