我有一个awk问题,让我说我有这个:
up2left3right
我想用awk将其更改为:
up
up
left
left
left
right
关于如何做到这一点的任何想法? 提前谢谢!
答案 0 :(得分:4)
以下是gnu awk
版本(由于RS
和RT
)
echo "up2left3right" | awk '{for (i=1;i<=(RT?RT:1);i++) if (NF) print $0}' RS="[0-9]"
up
up
left
left
left
right
它将记录分隔符更改为数字
然后RT
存储使用的RS
,我们使用循环来重复数据。
现在使用的数字大于9
(多位数)的更新版本
还在\n
中添加了RS
,以便在行尾和多行
awk '{i=RT=="\n"?1:RT;while(i--) if (NF) print $0}' RS="[0-9]+|\n" file
echo -e "up3left12right\ntest4more" | awk '{i=RT=="\n"?1:RT;while(i--) if (NF) print $0}' RS="[0-9]+|\n"
up
up
up
left
left
left
left
left
left
left
left
left
left
left
left
right
test
test
test
test
more
答案 1 :(得分:4)
另一种选择是使用perl
:
$ echo up2left3right | perl -pe 's/([A-Za-z]+)(\d+)/"$1\n" x $2/gse;'
up
up
left
left
left
right
现在计数大于10:
$ echo up2down10left2right | perl -pe 's/([A-Za-z]+)(\d+)/"$1\n" x $2/gse;'
up
up
down
down
down
down
down
down
down
down
down
down
left
left
right
答案 2 :(得分:2)
这是常规awk
的可行方式:
$ echo "up2left3right1wrong2boo" |
awk '{x=gsub(/[0-9]+/," & ");for(i=1;i<=x*2;i+=2){while($(i+1)--)print $i};if(i)print $i}'
up
up
left
left
left
right
wrong
wrong
boo
我们基本上在一个数字之前和之后创建一个空格并循环遍历每个元素。一旦我们遇到单词编号对,我们就会使用while loop
继续打印该单词,直到数字用完为止。如果单词存在,然后使用if
循环进行测试,我们将其打印出来。
虽然它会在单词缺少数字的地方打破,然后是带有数字的单词。对于以下情况,它会将rightwrong
视为一个词:
up2left3rightwrong2