1

我有一个看起来像这样的测试文件:

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数组包含我所有的单词(Bye, Hello, Tango),并且该MyInteger数组包含我希望每个单词重复的次数。

4

3 回答 3

4

使用 awk:

awk '{for (i=0; i<$2; i++) print $1}' file > output
于 2013-07-09T20:05:45.990 回答
1

或 perl

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

或重击

while read str num; do
    for ((i=0; i<$num; i++)); do
        echo $str
    done
done < filename
于 2013-07-09T20:29:46.840 回答
1

另一个深奥的变体:

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

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

解释:

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

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

seq如果您提供的字符串format没有数字规范 ( %g) 它只是重复formatN 次,所以

seq -f hello 10

相当于

yes hello | head -10
于 2013-07-10T07:08:17.550 回答