如何重复一段文本?

如何重复一段文本?

如何使用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的最新版本,对于固定文本,您可以执行以下操作:bashksh93yash -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

可以说,这会花费更多一点,因为调用了数组。

相关内容