0

我有一个制表符分隔的 .txt 文件,其格式为:

chrI    0   1   -4.231
chrI    1   2   -3.257
chrI    2   3   -2.653
chrI    3   4   -2.102
chrI    4   5   -1.685
chrI    5   6   -1.331
chrI    6   7   -1.036
chrI    7   8   -0.728
chrI    8   9   -0.527
chrI    9   10  -0.401

我有没有机会让文本管理员将第 2 列中的所有条目替换为第 3 列值,以便第 3 列本质上是重复的?

比如这样:

chrI    1   1   -4.231
chrI    2   2   -3.257
chrI    3   3   -2.653
chrI    4   4   -2.102
chrI    5   5   -1.685
chrI    6   6   -1.331
chrI    7   7   -1.036
chrI    8   8   -0.728
chrI    9   9   -0.527
chrI    10  10  -0.401

有没有办法在 Perl 中做到这一点?

4

3 回答 3

1

从命令行:

perl -lane 'BEGIN{$"="\t"}$F[2]=$F[1];print "@F"' File.txt [>outFile]

最后一个可选参数将输出定向到文件。

输出:

chrI    0   0   -4.231
chrI    1   1   -3.257
chrI    2   2   -2.653
chrI    3   3   -2.102
chrI    4   4   -1.685
chrI    5   5   -1.331
chrI    6   6   -1.036
chrI    7   7   -0.728
chrI    8   8   -0.527
chrI    9   9   -0.401

或作为脚本(相同的输出):

use strict;
use warnings;

$" = "\t";

while (<>) {
    my @F = split;
    $F[2] = $F[1];
    print "@F\n";
}

命令行用法:perl script.pl File.txt [>outFile]

希望这可以帮助!

于 2013-12-10T19:18:00.317 回答
0

在 perl 中:

while (<$input>){
    chomp;
    my @split = split(/\t/);
    print "$split[0]\t$split[1]\t$split[1]\t$split[3]\n";
}
于 2013-12-10T18:59:22.787 回答
0

在 TextWrangler 中搜索^(\w+)\s+(\w+)\s+(\w+)\s+并替换为\1\t\3\t\3\tfind 的“匹配:”“Grep”选项已启用。(放轻松 - 使用制表符进行对齐而不是不同数量的空白......)

但是,如果您需要空白,请替换^(\w+\s+)(\w+\s+)(\w+\s+)\1\3\3... - 至少适用于示例数据。

于 2014-11-04T23:11:09.317 回答