我正在尝试为我计划使用的一些匹配代码创建一个查找表,但是我在制作表本身时遇到了麻烦。我的标签分隔数据如下所示:
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
答案 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
用制表符替换多个空格,然后用换行符和第一个字段替换前两个字段的///
的第一个出现位置。打印到第一个换行符,然后删除该行并重复。