我想要反转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
我想知道是否有更简单的命令来实现这一目标?
另一个awk
awk '{while ($1--) print $2}' file
这是另一种解决方案
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
条件为真时打印该值。
非常紧张
你不需要awk
或任何其他命令,你可以完全在bash
完成
while read n s
do
for ((i=0; i<n; i++))
do
echo $s;
done
done < test.txt
在这里,我的解决方案使用bash brace expansion和printf
内部命令。
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
命令来使用大括号扩展中的变量。