答案1
使用 Perl:
perl -pe 's/(\d+) (\d+\n)/$2 x $1/e' foo
这里:
-pe
在每一行上运行表达式,然后自动打印(\d+)
匹配一串数字,并(\d+\n)
匹配一串带有换行符的数字- 然后
$2 x $1
将第二个匹配的组复制与第一个匹配的组的值相同的次数。/e
告诉 Perl 替换也将作为 Perl 表达式进行评估
答案2
大王适合于此:
awk '{while ($1-- > 0) print $2}' test.txt
这会将 的每一行解释为由空格分隔的字段记录。它从第一个字段 ( ) 的值test.txt
开始倒数 ( ) ,直到该值为零,每次将第二个字段 ( ) 的值打印在其自己的行上。--
$1
$2
这种方法的优点之一是它可以自动容忍数字之前、之间或之后的多余空格。
具体来说:
$1
和$2
是第一个和第二个字段。while
-循环评估表达式$1-- > 0
。如果为真,则print $2
运行,然后重新开始。- 子表达式
$1--
将第一个字段的值减一。(这发生在内存中;实际文件text.txt
永远不会被修改。)但它返回值$1
与降低前的值相同。请参见Gawk:有效的 AWK 编程, 部分6.2.4 增量和减量运算符,以获得更详细的解释。
如果你愿意,你可以使用for
-环形:
awk '{for (; $1 > 0; --$1) print $2}' test.txt
或者使用专用循环计数器多变的:
awk '{for (i = $1; i > 0; --i) print $2}' test.txt
或者,如果你发现向上计数比向下计数更直观,你可以这样做:
awk '{for (i = 0; i < $1; ++i) print $2}' test.txt