每 n 行插入多个空格
Insert multiple blanks every n rows
我试图在数据文件的每 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 粘贴。
EDIT2: 你的问题从 1 变成了另一个,没关系,请尝试关注你的 2 个文件问题。
awk 'FNR==NR{a[FNR]=[=10=];next} NF==1{sub(/^>/,"");print a[++count],[=10=];next} 1' inputa inputb
编辑: 由于评论中提到的 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 [=14=] ORS ORS ORS;next} 1' Input_file
如果你想将输出输出到 output_file 中,那么也将 > output_file
附加到上面的代码中。
每输入 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。
如果这不是您想要的,请编辑您的问题以阐明您的要求并提供简明、可测试的示例输入和预期输出。
关于你更新的问题,取决于输入 B 中的 ...
是什么,这可能是你真正应该使用的:
$ awk '
NR==FNR { a[NR]=[=11=]; next }
{
sub(/^>/,"")
print (NF==1 ? a[++c] : ">") OFS [=11=]
}
' inputA inputB
>1 1000
> ... ... ...
> ... ... ...
> ... ... ...
>0 2000
> ... ... ...
> ... ... ...
> ... ... ...
>1 3000
> ... ... ...
> ... ... ...
> ... ... ...
我试图在数据文件的每 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 粘贴。
EDIT2: 你的问题从 1 变成了另一个,没关系,请尝试关注你的 2 个文件问题。
awk 'FNR==NR{a[FNR]=[=10=];next} NF==1{sub(/^>/,"");print a[++count],[=10=];next} 1' inputa inputb
编辑: 由于评论中提到的 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 [=14=] ORS ORS ORS;next} 1' Input_file
如果你想将输出输出到 output_file 中,那么也将 > output_file
附加到上面的代码中。
每输入 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。
如果这不是您想要的,请编辑您的问题以阐明您的要求并提供简明、可测试的示例输入和预期输出。
关于你更新的问题,取决于输入 B 中的 ...
是什么,这可能是你真正应该使用的:
$ awk '
NR==FNR { a[NR]=[=11=]; next }
{
sub(/^>/,"")
print (NF==1 ? a[++c] : ">") OFS [=11=]
}
' inputA inputB
>1 1000
> ... ... ...
> ... ... ...
> ... ... ...
>0 2000
> ... ... ...
> ... ... ...
> ... ... ...
>1 3000
> ... ... ...
> ... ... ...
> ... ... ...