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

问题描述 投票:3回答:4

我想要反转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

我想知道是否有更简单的命令来实现这一目标?

bash count reverse uniq
4个回答
3
投票

另一个awk

awk '{while ($1--) print $2}' file

2
投票

这是另一种解决方案

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

产量

hi
test
test
try
try
try

这将以相同的方式工作

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

当然,脚本的核心

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

其中awk已将输入解析为2个字段,$1为数字(1,2,3),$ 2为值,(hi,test,try)。

条件i<=$1测试计数器i没有增加超过字段$ 1中提供的计数,并且print $2每次i<=$1条件为真时打印该值。

非常紧张


2
投票

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

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

2
投票

在这里,我的解决方案使用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

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

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

显示:

test
test

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

最后,必须在其他地方使用eval命令来使用大括号扩展中的变量。

© www.soinside.com 2019 - 2024. All rights reserved.