Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 组合线的元素_Perl_File_Awk - Fatal编程技术网

Perl 组合线的元素

Perl 组合线的元素,perl,file,awk,Perl,File,Awk,我正在寻找这个问题的解决方案: 我有一个文件(选项卡分隔),如下面的blockquote所示。如你所见 有与第一部分匹配的行(粗体字段) chr4 164440449 165354407 G1 P8002-51-75 chr1 220871675 220962596 G2P2368-132-84 chr1 220871675 220962596 G2P2369-152-116 chr1 220871675 220962596 G2P2371-180-82 chr1 220871675 22096

我正在寻找这个问题的解决方案: 我有一个文件(选项卡分隔),如下面的blockquote所示。如你所见 有与第一部分匹配的行(粗体字段)

chr4 164440449 165354407 G1 P8002-51-75
chr1 220871675 220962596 G2P2368-132-84
chr1 220871675 220962596 G2P2369-152-116
chr1 220871675 220962596 G2P2371-180-82
chr1 220871675 220962596 G2P2372-223-129
chr1 220871675 220962596 G2P2373-153-96
chr1 220871675 220962596 G2P2370-104-78
chr5 126198405 126416440 G3P9333-135-146
chr5 126198405 126416440 G3P9334-151-116

使用AWK或PERL,我如何能够保存制表符分隔格式来获得以下输出???一般的概念是根据第一部分统一行,并附加最后一个字段

chr4 164440449 165354407 G1 P8002-51-75
chr1 220871675 220962596 G2P2368-132-84 P2369-152-116 P2371-180-82 P2372-223-129 P2373-153-96 P2370-104-78
chr5 126198405 126416440 G3P9333-135-146 P9334-151-116


一般的概念是尝试根据第一部分统一行,并使用
perl
单向追加最后一个字段:

perl -ane '
    ## Save all fields but the last one as the key to compare between rows.
    $key = join qq|\t|, @F[ 0 .. $#F - 1 ];

    ## In first line or when current key is equal to previous key, save last
    ## field in an array and stop processing current row.
    if ( $. == 1 || $key eq $pkey ) {
        $pkey = $key;
        push @value, $F[ $#F ];
        next unless eof;
    }

    ## At this point, keys between rows are different, so print previous
    ## key with its values and begin to save the new one.
    printf qq|%s\n|, join qq|\t|, $pkey, @value;
    @value = ();
    push @value, $F[ $#F ];

    ## Exception: Last line with a new key, print it.
    if ( eof && $pkey ne $key ) {
    printf qq|%s\n|, join qq|\t|, $key, @value;
    }

    ## Save previous key.
    $pkey = $key;

' infile
假设
infle
包含您问题的数据,则输出为:

chr4    164440449       165354407       G1      P8002-51-75
chr1    220871675       220962596       G2      P2368-132-84    P2369-152-116   P2371-180-82    P2372-223-129   P2373-153-96    P2370-104-78
chr5    126198405       126416440       G3      P9333-135-146   P9334-151-116

使用
perl
的一种方法:

perl -ane '
    ## Save all fields but the last one as the key to compare between rows.
    $key = join qq|\t|, @F[ 0 .. $#F - 1 ];

    ## In first line or when current key is equal to previous key, save last
    ## field in an array and stop processing current row.
    if ( $. == 1 || $key eq $pkey ) {
        $pkey = $key;
        push @value, $F[ $#F ];
        next unless eof;
    }

    ## At this point, keys between rows are different, so print previous
    ## key with its values and begin to save the new one.
    printf qq|%s\n|, join qq|\t|, $pkey, @value;
    @value = ();
    push @value, $F[ $#F ];

    ## Exception: Last line with a new key, print it.
    if ( eof && $pkey ne $key ) {
    printf qq|%s\n|, join qq|\t|, $key, @value;
    }

    ## Save previous key.
    $pkey = $key;

' infile
假设
infle
包含您问题的数据,则输出为:

chr4    164440449       165354407       G1      P8002-51-75
chr1    220871675       220962596       G2      P2368-132-84    P2369-152-116   P2371-180-82    P2372-223-129   P2373-153-96    P2370-104-78
chr5    126198405       126416440       G3      P9333-135-146   P9334-151-116
while(){
($x,$y)=/^(.*)s([-\w]+)$/;
推送{$hash{$x}},$y;
}
而($k,$v)=每个%hash){
打印$k,join(“\t”,@{$v}),“\n”;
}
__资料__
chr4 164440449 165354407 G1 P8002-51-75
chr1 220871675 220962596 G2 P2368-132-84
chr1 220871675 220962596 G2 P2369-152-116
chr1 220871675 220962596 G2 P2371-180-82
chr1 220871675 220962596 G2 P2372-223-129
chr1 220871675 220962596 G2 P2373-153-96
chr1 220871675 220962596 G2 P2370-104-78
chr5 126198405 126416440 G3 P9333-135-146
chr5 126198405 126416440 G3 P9334-151-116
while(){
($x,$y)=/^(.*)s([-\w]+)$/;
推送{$hash{$x}},$y;
}
而($k,$v)=每个%hash){
打印$k,join(“\t”,@{$v}),“\n”;
}
__资料__
chr4 164440449 165354407 G1 P8002-51-75
chr1 220871675 220962596 G2 P2368-132-84
chr1 220871675 220962596 G2 P2369-152-116
chr1 220871675 220962596 G2 P2371-180-82
chr1 220871675 220962596 G2 P2372-223-129
chr1 220871675 220962596 G2 P2373-153-96
chr1 220871675 220962596 G2 P2370-104-78
chr5 126198405 126416440 G3 P9333-135-146
chr5 126198405 126416440 G3 P9334-151-116

请参阅:您的数据是否已按所示分组,或者某些行是否出现顺序错误?请参阅:您的数据是否已按所示分组,或者某些行是否出现顺序错误?