2016-05-05 3 views
0

У меня есть файл data.csv с несколькими линиями, которые читает:Как приумножить AWK выход

A 
B 
C 

и я хочу, выход кода необходимо умножить п раз:

A 
B 
C 
A 
B 
C 

Здесь является примером линии я пытался и что она возвращает:

awk '{for (i=0; i<3 ;i++){ print $1}}' input.csv 
A 
A 
A 
B 
B 
B 
C 
C 
C 

то же самое с кошкой и другими инструментами

+2

Почему не "кошки" файл, в 3 раза? Нужно ли вам работать с трубами? Знаете ли вы о требованиях к памяти? – LatinSuD

+0

Спасибо вам за ответ! Это не нужно было делать с кошкой, я только что узнал об awk сегодня, и мне было любопытно, есть ли способ использовать его. –

ответ

2
$ awk -v n=3 'BEGIN{ for (i=1;i<n;i++) {ARGV[ARGC]=ARGV[1]; ARGC++} } 1' file 
A 
B 
C 
A 
B 
C 
A 
B 
C 

Обратите внимание, что выше только хранит имя файла n раз, а не в содержимое файла и поэтому было бы работать на любой файл любого размера, как он использует незначительную память.

+1

'ARGV [ARGC++] = ARGV [1]' будет работать, не так ли? – 123

+2

Это то, что я использовал, пока кто-то не указал мне на какой-то документ, который по существу показал, что вы не могли гарантировать, что «ARGC++» не произойдет до назначения. Я не помню, было ли это спецификацией POSIX или что, но между этим и ясностью я убедил меня изменить, чтобы всегда явно помещать «ARGC++» после назначения. –

+1

Ах, хорошо, приятно знать, спасибо! – 123

1

Вот один эффективный 1-лайнер: yes data | head -3 | xargs cat

$ cat data 
A 
B 
C 
$ yes data | head -3 | xargs cat 
A 
B 
C 
A 
B 
C 
A 
B 
C 
$ 

head -3 => здесь 3 указывает n количество раз.

Или используя awk решение:

$ cat data 
A 
B 
C 
$ awk 'BEGIN{i=0} {a[i]=$0;i++} END {for(i=0;i<=3;i++) for(j=0;j<=NR;j++) print a[j]}' data | sed '/^$/d' 
A 
B 
C 
A 
B 
C 
A 
B 
C 
A 
B 
C 
$ 
2

Это будет делать:

for i in {1..3}; do cat data.csv; done 

Он не будет работать с трубами, хотя.

Спасибо за комментарии

+0

Это неэффективно, поскольку он вилка кота каждый раз. – 123

+0

Я имел в виду экономию памяти, а не хранение всего блока в памяти. Спасибо за комментарии. – LatinSuD

0
for ((c=1; c<=3; c++)) 
do 
cat Input_file.csv 
done 
+0

извините, мой плохой. У меня вопрос неправильный. скоро исправит его. – monk

+0

исправлено согласно требованию, но другие способы лучше. – monk

+0

@ user2809888 Вы просите @monk объяснить 'cat', вызванный в цикле от 1 до 3 ??? –

0

предположив, что вы пишете оболочку-скрипт, зачем использовать AWK?

for i in `seq 3`; do 
    cat data.csv 
done 

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

cat data.csv | \ 
    awk '{a = a $0 "\n"} END { for (i=0; i<3 ;i++){ printf "%s",a; }}' 
+1

На самом деле вы правы, это проще сделать, не используя awk с циклом for, мне было любопытно, есть ли способ, так как я не нашел об этом в другом месте. Также я новичок, спасибо за ваш вклад. –

2

Вы можете использовать кошку и Printf

cat $(printf "%0.sfile " {1..3}) 
1

Попробуйте это:

seq 2 | xargs -Inone cat input.csv 
+0

Ницца. Я просто смотрел на такие «xargs» и пытался выяснить, как заставить его игнорировать вывод «seq». –

0

С СЕПГ и удерживать/модель пространства:

В эта ситуация только с одиночные буквы.Соответственно ABC:

Если вы хотите напечатать один раз:

cat temp | sed 's/\(.*\)/\1/;N;N;H' 

выход:

[[email protected] ~]$ cat temp | sed 's/\(.*\)/\1/;N;N;H;G;G' 
A 
B 
C 
[[email protected] ~]$ 

Дважды (Просто добавьте полу-двоеточия/капитал G полн он конец):

cat temp | sed 's/\(.*\)/\1/;N;N;H;G' 

мощность:

[[email protected] ~]$ cat temp | sed 's/\(.*\)/\1/;N;N;H;G;G' 
A 
B 
C 

A 
B 
C 
[[email protected] ~]$ 

Трижды (Другой G):

cat temp | sed 's/\(.*\)/\1/;N;N;H;G;G' 

выход:

[[email protected] ~]$ cat temp | sed 's/\(.*\)/\1/;N;N;H;G;G' 
A 
B 
C 

A 
B 
C 

A 
B 
C 
[[email protected] ~]$ 

и так далее.

Файл (не имеет новых строк в файле):

[[email protected] ~]$ cat temp 
A 
B 
C 
[[email protected] ~]$ 
Смежные вопросы