hio*_*iob 4 regex variables awk sed
我不确定我是否可以用sed完全做到这一点:
我想重新排列这样的线条
GF:001,GF:00012,GF:01223<TAB>XXR
GF:001,GF:00012,GF:01223,GF:0666<TAB>XXXR3
Run Code Online (Sandbox Code Playgroud)
至
GF:001<TAB>XXR
GF:00012<TAB>XXR
GF:01223<TAB>XXR
GF:001<TAB>XXXR3
GF:00012<TAB>XXXR3
GF:01223<TAB>XXXR3
GF:0666<TAB>XXXR3
Run Code Online (Sandbox Code Playgroud)
任何提示?GF:XXXX的基数是GF:XXXX的长度.
我坚持,sed -n '
'/\(XX.*\)$/' {
s/,/\t\1\n/
}' input
但我不能首先引用最初匹配的模式.有任何想法吗?干杯!
更新:我认为仅使用sed是不可能的.所以我使用perl来做到这一点:
perl -e 'open(IN, "< file");
while (<IN>) {
@a = split(/\t/);
@gos = split(/,/, $a[0]);
foreach (@gos) {
print $_."\t".$a[1];
}
close( IN );' > output
Run Code Online (Sandbox Code Playgroud)
但是,如果有人知道解决这个问题的方法,sed
请在这里发布...
sed
虽然我可能会使用Perl(或Awk或Python)来完成它,但它可以完成.
我声称这种解决方案没有优雅,但蛮力和无知有时会得到回报.我创建了一个名为unordiginally的文件,sed.script
其中包含:
/\(GF:[0-9]*\),\(.*\)<TAB>\(.*\)/{
:redo
s/\(GF:[0-9]*\),\(.*\)<TAB>\(.*\)/\1<TAB>\3@@@@@\2<TAB>\3/
h
s/@@@@@.*//
p
x
s/.*@@@@@//
t redo
d
}
Run Code Online (Sandbox Code Playgroud)
我把它当作:
sed -f sed.script input
Run Code Online (Sandbox Code Playgroud)
其中input
包含问题中显示的两行.它产生了输出:
GF:001<TAB>XXR
GF:00012<TAB>XXR
GF:01223<TAB>XXR
GF:001<TAB>XXXR3
GF:00012<TAB>XXXR3
GF:01223<TAB>XXXR3
GF:0666<TAB>XXXR3
Run Code Online (Sandbox Code Playgroud)
(我冒昧故意误解<TAB>
为5个字符的序列而不是单个制表符;您可以轻松修复答案以处理实际的制表符.)
sed
脚本说明:
GF:nnn
以逗号分隔的行的行(我们不需要处理包含单个此类事件的行).只在这样的行上执行脚本的其余部分.其他任何东西都通过(打印)不变.<TAB>
.将其替换为第一个字段,<TAB>
第三个字段,难以置信的标记图案(@@@@@
),第二个字段<TAB>
,第三个字段.redo
标签上.这是一个简单的循环,可以在每次迭代时将模式数减少一个.