Как повторить блок текста?

Если вы проверите psinfo для процесса с PID 1 из В каталоге / proc вы можете получить такую ​​структуру:

struct   pr_timestruc64_t pr_start; /* process start time, time since epoch */

Вот веб-страница , которую вы можете использовать для справки.

4
19.07.2016, 00:20
5 ответов

(где ввод - это файл, содержащий текст для повторения)

С 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 "$@"

Это будет работать независимо от того, какой байт содержит вход . Однако обратите внимание, что для больших значений n и если ваша оболочка не имеет встроенного cat , вы можете достичь системного ограничения на размер аргументов команды (здесь кот ).

С помощью zsh или последних версий bash или ksh93 или yash -o braceexpand для фиксированного текста вы можете делать что-то например:

printf '%.0sstring1\nstring2\nstring3\n' {1..100}

С zsh :

repeat 100 print -l string{1..3}

Если мы дерзки, в системах с установленным GNU seq мы также можем сделать:

seq -f 'string1
string2
string%.0g' 3.0001 0.0001 3.0100
3
27.01.2020, 20:48

С 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;'
3
27.01.2020, 20:48

Хотя этот вопрос помечен как awk , я хотел бы добавить простое решение, которое не использует awk :

seq 100 | xargs -n1 -I{} echo "1 2 3"

Если данные, которые вы должны повторить, находятся в файле, используйте вместо этого:

seq 100 | xargs -n1 -I{} cat filename

Другое решение может использовать команду yes , которая просто повторяет свои аргументы:

yes "1 2 3" | head -n100
4
27.01.2020, 20:48

В / 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

Возможно, это стоит немного дороже, потому что вызывается массив.

0
27.01.2020, 20:48

Вместо использования AWK я бы просто использовал цикл for:

for i in $(seq 100); do
    echo string1
    echo string2
    echo string3
done
1
27.01.2020, 20:48

Теги

Похожие вопросы