每n行插入多个空格

时间:2018-06-27 04:10:46

标签: bash awk blank-line

我正在尝试在数据文件中的每n行之后插入多个空行。

到目前为止,我有这行代码,每1行之后插入1个空行:

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

然后我尝试循环它,所以我每1行插入10行:

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

但是我认为我的语法不正确。有什么建议么?

理想的输出是将输入A粘贴到输入B上,使其看起来像这样:

(1)输入-A

>1   
>0   
>1 

(2)输入-B

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

(3)粘贴输入A和输入B

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

因此,为什么要尝试在输入A的行之间创建适当数量的空格,以便它可以轻松地与输入B粘贴。

2 个答案:

答案 0 :(得分:2)

要每3个输入行插入2个空行:

$ 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

要每10条输入行打印12,000条空白行,只需将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
> ... ... ...
> ... ... ...
> ... ... ...

答案 1 :(得分:0)

EDIT2: 。您的问题从1急剧变化为另一个,没关系,请问您可以尝试关注2个文件的问题。

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

编辑: 由于注释中提到的OP,OP希望在Input_file的第10行之后注入12,000行。好的,这是我可以编写的循环,每次循环将在代码中迭代12,000次以打印空白行并使大型文件的代码处理非常慢。我想出了类似先创建一个文件,其中包含12,000条空白行的文件,然后在awk代码中简单地调用它来打印行,这将比每次循环打印12,000行的方法快得多

第一步: 创建一个文件,该文件具有12,000个空行,如下所示。

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

第二步: 检查文件中的行数为12,000。

wc -l "blank_file"
12000 blank_file

第三步: 使实际代码每次在您的真实代码中打印12000空白行。

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

注意: :在第二步中,您可以将12000更改为该循环中的空白行数,也可以打印更多或更少的行。



如果是这种情况,那么您想在每10行Input_file之后插入3行,那么下面的内容可能会对您有所帮助。

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

如果要将输出放入output_file,则也将> output_file附加到上述代码中。