Вставьте несколько пробелов каждые n строк - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь вставить несколько пустых строк после каждой n строки в файле данных.

Пока у меня есть эта строка, которая вставляет 1 пустую строку после каждой 1 строки:

awk '1 ; !(NR % 1) {print "";}' in.file >> out.file

И затем я пытаюсь зациклить его, поэтому я вставляю 10 строк в каждую строку:

awk '1; {for(i=0; i<10; i++)} !(NR % 1) {print "";}'

Но я не думаю, что у меня правильный синтаксис. Какие-либо предложения?

Идеальный вывод - взять input-A и вставить его в input-B, чтобы он выглядел так:

(1) вход-A

>1   
>0   
>1 

(2) вход-B

>1000    
>... ... ...  
>... ... ...  
>... ... ...  
>2000    
>... ... ...  
>... ... ...  
>... ... ...  
>3000    
>... ... ...  
>... ... ...  
>... ... ...  

(3) вставленный ввод-A и ввод-B

>1  1000    
>   ... ... ...  
>   ... ... ...  
>   ... ... ...  
>0  2000    
>   ... ... ...  
>   ... ... ...  
>   ... ... ...  
>1  3000    
>   ... ... ...  
>   ... ... ...  
>   ... ... ... 

Поэтому я пытаюсь создать нужное количество пробелов между строками ввода-A, чтобы он легко вставлялся с помощью ввода-B.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Чтобы вставить 2 пустых строки через каждые 3 строки ввода:

$ seq 10 |
    awk -v n=2 -v m=3 '
        BEGIN {
            lines = sprintf("%*s",n-1,"")
            gsub(/ /,ORS,lines)
        }
        { print }
        (NR%m) == 0 {
            print lines
        }
    '
1
2
3


4
5
6


7
8
9


10

Чтобы печатать 12 000 пустых строк через каждые 10 строк ввода, просто измените n = 2 на n = 12000 и m = 3 на m = 10.

Если это не то, что вам нужно, отредактируйте ваш вопрос, чтобы уточнить ваши требования и предоставить краткий, тестируемый образец ввода и ожидаемый результат.

относительно вашего обновленного вопроса, в зависимости от того, что это за ... в inputB, это может быть то, что вы действительно должны использовать:

$ awk '
    NR==FNR { a[NR]=$0; next }
    {
        sub(/^>/,"")
        print (NF==1 ? a[++c] : ">") OFS $0
    }
' inputA inputB
>1 1000
> ... ... ...
> ... ... ...
> ... ... ...
>0 2000
> ... ... ...
> ... ... ...
> ... ... ...
>1 3000
> ... ... ...
> ... ... ...
> ... ... ...
0 голосов
/ 27 июня 2018

РЕДАКТИРОВАТЬ 2: Ваш вопрос кардинально изменился с 1 на другой, не берите в голову, пожалуйста, попробуйте ответить на вопрос 2 файла.

awk 'FNR==NR{a[FNR]=$0;next} NF==1{sub(/^>/,"");print a[++count],$0;next} 1' inputa inputb

РЕДАКТИРОВАТЬ: Поскольку OP упоминается в комментариях, OP хочет ввести 12 000 строк после каждой 10-й строки Input_file. Итак, вот сделка, я мог бы написать цикл, который будет каждый раз повторять код по 12000 раз, чтобы печатать пустые строки и очень медленно выполнять обработку кода для больших файлов. Я придумал что-то вроде создания файла, в котором сначала содержится 12 000 пустых строк, а затем в коде awk просто вызывается его для печати строк, что будет намного быстрее, чем при печати 12 000 строк каждый раз в цикле.

1-й шаг: Создайте файл с 12 000 пустых строк следующим образом.

awk 'BEGIN{while(++i<=12000){print "" > "blank_file"}}'

2-й шаг: Проверка строк в файле 12 000.

wc -l "blank_file"
12000 blank_file

3-й шаг: Введите реальный код для печати 12000 пустых строк каждый раз в вашем реальном коде.

awk 'FNR%10==0{print;system("cat blank_file");next} 1'  Input_file

ПРИМЕЧАНИЕ: На втором шаге вы можете изменить 12000 на количество пустых строк в этом цикле и также напечатать больше или меньше строк.



Допустим, вы хотите вставить 3 новые строки после каждых 10 строк Input_file, если это так, тогда вам может помочь следующее.

awk 'FNR%10==0{print $0 ORS ORS ORS;next} 1' Input_file

Если вы хотите перенести выходные данные в выходной_файл, добавьте > output_file к вышеуказанному коду.

...