【问题标题】:Is there any better solution to reverse uniq count有没有更好的解决方案来反转 uniq 计数
【发布时间】:2018-01-02 04:15:55
【问题描述】:

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

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

【问题讨论】:

  • 我认为您的解决方案很棒。非常有创意地使用yes

标签: bash count reverse uniq


【解决方案1】:

另一个awk

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

【讨论】:

  • 目前最简单的解决方案,我可以问一下'($1--)'吗?
  • 此条件返回 $1 并将其减一。与具有 ++,-- 操作数的其他语言类似,每次求值后都会发生缩减。所以它从$1 向下计数到零,对于每一行。
【解决方案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&lt;=$1 测试计数器i 没有增加超过字段$1 中提供的计数,并且print $2 每次i&lt;=$1 条件为真时打印该值。

IHTH

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 引用扩展名,您可能还想使用read -r ...
    【解决方案4】:

    这里我的解决方案使用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中使用才能在大括号扩展中使用变量。

    【讨论】:

      猜你喜欢
      • 2015-02-04
      • 2021-08-24
      • 2013-10-22
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多