如何使用awk
重复一段文本 100 次?
IE
string1
string2
string3
会成为:
string1
string2
string3
string1
string2
string3
string1
string2
string3...
答案1
尽管这个问题已标记awk
,但我想添加一个不使用的简单解决方案awk
:
seq 100 | xargs -n1 -I{} echo "1 2 3"
如果要重复的数据位于文件中,请改用:
seq 100 | xargs -n1 -I{} cat filename
另一种解决方案可能使用 command yes
,它只是重复其参数:
yes "1 2 3" | head -n100
答案2
(其中input
包含要重复的文本的文件)
使用 GNU awk
(并假设输入不包含 NUL 字节):
awk -v n=100 -v RS='\0' -v ORS= '{while (n--) print}' < input
便携:
awk -v n=100 -v ORS= '
{all = all $0 RS}
END {while (n--) print all}' < input
(请注意,如果输入不以换行符结尾,则会添加一个换行符)。
您还可以执行以下操作:
set --
n=100; while [ "$n" -gt 0 ]; do
set -- "$@" input
n=$((n - 1))
done
cat "$@"
无论input
包含什么字节,这个都可以工作。但请注意,对于较大的 , 值n
,并且如果您的 shell 没有cat
内置命令,您可能会达到命令参数大小的系统限制(此处cat
)。
使用or或zsh
的最新版本,对于固定文本,您可以执行以下操作:bash
ksh93
yash -o braceexpand
printf '%.0sstring1\nstring2\nstring3\n' {1..100}
和zsh
:
repeat 100 print -l string{1..3}
如果我们厚颜无耻的话,在seq
安装了 GNU 的系统上,我们还可以这样做:
seq -f 'string1
string2
string%.0g' 3.0001 0.0001 3.0100
答案3
和awk
:
echo "t1 t2 t3" | awk '{l=$0; for(i=1;i++<100;) l=l" "$0} END{print l}'
与perl
:
echo "t1 t2 t3" | perl -ne 'chomp;print "$_ " x 100;'
答案4
在 上/bin/bash
,您可以对打印记录进行参数化,这样您就可以连续打印文件记录中的任意三个值 n 次。它们不必是连续的。
假设您想从输入文件中打印记录 2、3 和 6:inputfile
$ cat inputfile
A
B
C
D
E
F
$ awk -v RS='\n' '{if(NR=="2"||NR=="3"||NR=="6") a[NR]=$0} \
END{for(i=1;i++<=100;) {print a[2]"\n"a[3]"\n"a[6];}}' inputfile
可以说,这会花费更多一点,因为调用了数组。