如何使用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)忘记更新算法的描述,该描述仍然引用以前的实现。