AWK:用重复次数替换数字

时间:2014-03-08 14:34:01

标签: regex awk numbers repeat backreference

我有一个awk问题,让我说我有这个:

up2left3right

我想用awk将其更改为:

up
up
left
left
left
right

关于如何做到这一点的任何想法? 提前谢谢!

3 个答案:

答案 0 :(得分:4)

以下是gnu awk版本(由于RSRT

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