Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用awk为每个数据帧插入两行?_Awk_Insert_Lines - Fatal编程技术网

如何使用awk为每个数据帧插入两行?

如何使用awk为每个数据帧插入两行?,awk,insert,lines,Awk,Insert,Lines,我有如下重复数据 .... 4 4 4 66 79 169 150 0 40928 40938 40923 40921 40789 40000 40498 5 4 3 16 22 247 0 40168 40911 40944 40205 40000 40562 6 4 4 17 154 93 309 0 40930 40919 40903 40917 40852 40000 40419 7 3 2 233 311 0 40936 40932

我有如下重复数据

....
 4 4 4 66 79 169 150 0  40928  40938  40923  40921  40789  40000  40498
 5 4 3 16 22 247 0  40168  40911  40944  40205  40000  40562
 6 4 4 17 154 93 309 0  40930  40919  40903  40917  40852  40000  40419
 7 3 2 233 311 0  40936  40932  40874  40000  40807
....
该数据由115个数据块组成,每个数据块有4000行类似于该格式。 在这里,我希望在每个数据块的开头放置两行新行(每个数据块的行数=4000,空行),这样看起来

4000

 1 4 4 244 263 704 952 0  40936  40930  40934  40921  40820  40000  40570
 2 4 4 215 172 305 33 0  40945  40942  40937  40580  40687  40000  40410
 3 4 4 344 279 377 1945 0  40933  40915  40907  40921  40839  40000  40437
 4 4 4 66 79 169 150 0  40928  40938  40923  40921  40789  40000  40498
...
 3999 2 2 4079 4081 0  40873  40873  40746  40000  40634
 4000 1 1 4080 0  40873  40923  40000  40345
4000

 1 4 4 244 263 704 952 0  40936  40930  40934  40921  40820  40000  40570
 2 4 4 215 172 305 33 0  40945  40942  40937  40580  40687  40000  40410
 3 4 4 344 279 377 1945 0  40933  40915  40907  40921  40839  40000  40437
 4 4 4 66 79 169 150 0  40928  40938  40923  40921  40789  40000  40498
... 

我可以使用awk或任何其他unix命令来执行此操作吗

您可以在bash中完成这一切:

cat $FILE | ( let countmax=4000; let count=countmax; while read lin ; do if [ $count == $countmax ]; then let count=0; echo -e "$countmax\n" ; fi ; echo $lin ; let count=count+1 ; done )
这里我们假设您正在从$FILE读取此数据。然后,我们所做的就是从文件中读取数据,并将其传输到我们的小bash脚本中


bash脚本一行一行地读取(在读取lin时使用
),并为每行增加计数器
计数。启动或计数器计数达到值(设置为4000)时,它会打印出您要求的2行。

您可以在bash中完成所有操作:

cat $FILE | ( let countmax=4000; let count=countmax; while read lin ; do if [ $count == $countmax ]; then let count=0; echo -e "$countmax\n" ; fi ; echo $lin ; let count=count+1 ; done )
这里我们假设您正在从$FILE读取此数据。然后,我们所做的就是从文件中读取数据,并将其传输到我们的小bash脚本中


bash脚本一行一行地读取(在读取lin时使用
),并为每行增加计数器
计数。当启动或计数器计数达到值(设置为4000)时,它会打印出您要求的2行。

我的解决方案更一般,因为只要您重新启动第一个字段计数器以指示新块的开始,块的长度可能不相等

% cat mark_blocks
$1<count { print count; print "";
           for(i=1;i<=count;i++) print l[i]; }
# executed for each line
         { l[$1] = $0; count=$1}
END      { print count; print "";
           for(i=1;i<=count;i++) print l[i]; }
% awk -f mark_blocks your_data > marked_data
% 
%cat标记块

$1我的解决方案更一般,因为只要重新启动第一个字段计数器以表示新块的开始,块的长度可能不相等

% cat mark_blocks
$1<count { print count; print "";
           for(i=1;i<=count;i++) print l[i]; }
# executed for each line
         { l[$1] = $0; count=$1}
END      { print count; print "";
           for(i=1;i<=count;i++) print l[i]; }
% awk -f mark_blocks your_data > marked_data
% 
%cat标记块

$1使用
awk
的简单单行程序可以达到此目的

awk'NR%4000==1{print“4000\n”}{print$0}文件

它的作用

print$0
打印每一行。

NR%4000==1
选择
4000
第行。当它出现时,它会打印一个
4000
和一个新行
\n
,这是两个新行

NR
记录数,即到目前为止有效读取的行数

简单的测试

在第5行插入4000

awk'NR%5==1{print“4000\n”}{print$0}

输出:

4000

1
2
3
4
5
4000

6
7
8
9
10
4000

11
12
13
14
15
4000

16
17
18
19
20
4000

使用
awk
的简单单行程序可以达到此目的

awk'NR%4000==1{print“4000\n”}{print$0}文件

它的作用

print$0
打印每一行。

NR%4000==1
选择
4000
第行。当它出现时,它会打印一个
4000
和一个新行
\n
,这是两个新行

NR
记录数,即到目前为止有效读取的行数

简单的测试

在第5行插入4000

awk'NR%5==1{print“4000\n”}{print$0}

输出:

4000

1
2
3
4
5
4000

6
7
8
9
10
4000

11
12
13
14
15
4000

16
17
18
19
20
4000

谢谢,但这给了我两条空行,不是一条空行。所以,这段代码增加了3行。谢谢,但这给了我两行空行,而不是一行空行。因此,这段代码会产生3行额外的代码。您能将输出的前三行与需求示例的前三行进行比较吗?您的一行应该写为
NR%4000==1{print“4000\n}1
,这样在打印行1、#4001、#8001等之前就可以打印标题。它是
NR%4000==1{print“4000\n”}1
(有一个开始和结束双引号)。@GBOFI您找到我了。更正。谢谢:)我看到了两个小缺陷…(1)第一行代码中的
文件
参数需要与awk程序隔开一个空格,并且(2)您忘记更新算法的描述,该描述仍然引用以前的实现。请将输出的前三行与需求示例的前三行进行比较,好吗?您的一行应该写为
NR%4000==1{print“4000\n}1
,因此,在打印行#1、#4001、#8001等之前,先打印一个标题。它是
NR%4000==1{print“4000\n”}1
(带有开头和结尾双引号…。@gboffi你明白我的意思了。更正。谢谢:)我发现了两个小缺陷。。。(1) 第一行代码中的
文件
参数需要与awk程序隔开一个空格,并且(2)忘记更新算法的描述,该描述仍然引用以前的实现。