我有一个如下所示的测试文件:
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
数组包含我想要每个单词的次数重复。
答案 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