处理多个重复条目的好方法是什么?

时间:2015-07-03 17:06:52

标签: bash perl awk sed

我正在尝试为我计划使用的一些匹配代码创建一个查找表,但是我在制作表本身时遇到了麻烦。我的标签分隔数据如下所示:

1002_f_at       P33261 /// Q16743
1003_s_at       P32302 /// A8K647 /// Q2YD84 /// A0N0R2
1004_at P32302 /// A8K647 /// Q2YD84 /// A0N0R2

我希望它看起来像这样:

1002_f_at P33261
1002_f_at Q16743
1003_s_at P32302
1003_s_at A8K647 
1003_s_at Q2YD84 
1003_s_at A0N0R2
1004_at   P32302 

哪个也是制表符分隔。我希望有一个awk或Perl解决方案,但我还没有能够提出任何有效的东西

    sed 's: /// :\n\t:g' 

给了我:

    1002_f_at P33261
              Q16743
    1003_s_at P32302
              A8K647 
              Q2YD84 
              A0N0R2
    1004_at   P32302

4 个答案:

答案 0 :(得分:4)

您可以使用此awk命令:

awk -F '[[:blank:]]+|[[:blank:]]*///[[:blank:]]+*' '{for(i=2; i<=NF; i++) print $1, $i}' file
1002_f_at P33261
1002_f_at Q16743
1003_s_at P32302
1003_s_at A8K647
1003_s_at Q2YD84
1003_s_at A0N0R2
1004_at P32302
1004_at A8K647
1004_at Q2YD84
1004_at A0N0R2

答案 1 :(得分:3)

这在Perl中是微不足道的

perl -nE'($s,@r) = /\w+/g; say "$s\t$_" for @r' myfile

输出

1002_f_at   P33261
1002_f_at   Q16743
1003_s_at   P32302
1003_s_at   A8K647
1003_s_at   Q2YD84
1003_s_at   A0N0R2
1004_at P32302
1004_at A8K647
1004_at Q2YD84
1004_at A0N0R2

答案 2 :(得分:1)

Perlishly:

xd:>stream create sourcecsv --definition "file --outputType=text/plain | json-to-tuple |jdbc --columns=id,name,gender --tableName=csvfiletomysql_tbl3 --username=bigdata --password=bigdata --url=jdbc:mysql://localhost:3306/test --driverClassName=com.mysql.jdbc.Driver --initializeDatabase=true" --deploy

打印数据:

#!/usr/bin/env perl
use strict;
use warnings;

while (<>) {
    my ( $key, $values ) = m/^\s*(\w+)\s*(.*)/;
    foreach my $value ( split( " /// ", $values ) ) {
        print "$key $value\n";
    }
}

这可以简化为一个班轮因此:

1002_f_at P33261
1002_f_at Q16743
1003_s_at P32302
1003_s_at A8K647
1003_s_at Q2YD84
1003_s_at A0N0R2
1004_at P32302
1004_at A8K647
1004_at Q2YD84
1004_at A0N0R2

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/\s+/\t/;s#^((\S+)\t\S+)\s*///#\1\n\2#;P;D' file

用制表符替换多个空格,然后用换行符和第一个字段替换前两个字段的///的第一个出现位置。打印到第一个换行符,然后删除该行并重复。