是否有更好的解决方案来反转 uniq 计数

Is there any better solution to reverse uniq count

我想反转 uniq -c 的输出:

  1 hi
  2 test
  3 try

至:

hi
test  
test  
try  
try  
try

我现在的解决方案是使用循环:

while read a b; do yes $b |head -n $a ;done <test.txt

不知道有没有更简单的命令可以实现?

这是另一个解决方案

echo "\
1 hi
2 test
3 try" | awk '{for(i=1;i<=;i++){print()}}'

输出

hi
test
test
try
try
try

这将以相同的方式工作,

awk '{for(i=1;i<=;i++){print()}}' uniq_counts.txt

脚本的核心,if course

 { for (i=1;i<=;i++) { print  }

其中 awk 已将输入解析为 2 个字段,</code> 是数字 (1,2,3),$2 是值,(hi,test,try)。</p> <p>条件 <code>i<= 测试计数器 i 没有增加超过字段 $1 中提供的计数,并且 print 每次 i<= 时打印该值条件为真。

IHTH

您不需要 awk 或任何其他命令,您完全可以在 bash

中完成
while read n s
do
    for ((i=0; i<n; i++))
    do
        echo $s;
    done
done < test.txt

这里我的解决方案使用 bash brace expansionprintf 内部命令。

while read a b
do
     eval printf "'%.${#b}s\n'" "'$b'"{1..$a}
done <test.txt

下面简单的例子

printf '%s\n' test{1..2}

打印两行,其中包含字符串 test 后跟一个数字:

test1
test2

但我们可以使用 printf 命令的 precision field 指定要打印的确切字符数:

printf '%.4s\n' test{1..2}

显示:

test
test

要打印的字符的长度由要打印的文本的长度给定 (${#b})。

最后,eval 命令必须在 other 中使用,以便在大括号扩展中使用变量。

另一个awk

awk '{while (--) print }' file