重复每一行到新的一行

时间:2013-07-09 20:02:12

标签: arrays linux bash loops

我有一个如下所示的测试文件:

Hello 2
Bye 3
Tango 4

(真实文件有30,000行)。

我想要一个看起来像这样的新文件:

Hello
Hello
Bye
Bye
Bye
Tango
Tango
Tango
Tango

我尝试了这个,但它不起作用:

#!/bin/bash

Mywords=( $(awk '{ print $1 }' test) )
MyInteger=( $(awk '{ print $2 }' test) )
Countline=$(awk '{ print $1 }'  test | wc -l)

for ((i=0; i<$Countline ;i=i+1))
do
    for ((y=0; y<${MyInteger[$i]}  ;y=y+1))
        echo -e ${Sequences[$i]} > mynewfile
    do
    done
done

Mywords数组包含我的所有单词(ByeHelloTango),MyInteger数组包含我想要每个单词的次数重复。

3 个答案:

答案 0 :(得分:4)

使用awk:

awk '{for (i=0; i<$2; i++) print $1}' file > output

答案 1 :(得分:1)

或perl

perl -ane 'chomp; print "$F[0]\n" x $F[1]' filename

或bash

while read str num; do
    for ((i=0; i<$num; i++)); do
        echo $str
    done
done < filename

答案 2 :(得分:1)

另一个深奥的变体:

xargs -n2 seq -f <input.txt >out.txt

它不是很有效,因为(在你的情况下)将开始seq命令的30k倍,因此当重复计数大于30-40k时,它可以比awk有效。 (至少在我的笔记本上)

说明:

xargs将针对每个2个参数运行,seq -f arg1 arg2因此,您的输入将会运行

seq -f Hello 2
seq -f Bye 3
seg -f Tango 4

对于seq,如果您提供的format字符串没有数字规范(%g),则只需重复format次N次,所以

seq -f hello 10

相当于

yes hello | head -10