linux - 使用列中的引用拆分文件

标签 linux bash awk

这样做的目的是使用第 5 列作为引用拆分以下文件

336843.75 2395106.25 36289 38580 660                          
336843.75 2395118.75 36290 38580 660                          
336843.75 2395131.25 36291 38580 661                          
336843.75 2395143.75 36292 38580 662                          
336843.75 2395156.25 36293 38580 662                          
336843.75 2395168.75 36294 38580 663                          
336843.75 2495381.25 44311 38580 665                          
336843.75 2495393.75 44312 38580 760                          
336843.75 2495406.25 44313 38580 761                          
336843.75 2495418.75 44314 38580 762                          
336843.75 2495431.25 44315 38580 764                          
336843.75 2495443.75 44316 38580 765                          
336993.75 2394956.25 36277 38592 765                          
336993.75 2394968.75 36278 38592 766                          
336993.75 2394981.25 36279 38592 770                          

使用此代码,我减去第 5 列中的行以确定何时存在大于 50 的间隙。结果在第 6 列中

awk '{$6=$5-prev5} {prev5=$5; print}' file    

336843.75 2395106.25 36289 38580 660 660                      
336843.75 2395118.75 36290 38580 660 0                        
336843.75 2395131.25 36291 38580 661 1                        
336843.75 2395143.75 36292 38580 662 1                        
336843.75 2395156.25 36293 38580 662 0                        
336843.75 2395168.75 36294 38580 663 1                        
336843.75 2495381.25 44311 38580 665 2                        
336843.75 2495393.75 44312 38580 760 95                       
336843.75 2495406.25 44313 38580 761 1                        
336843.75 2495418.75 44314 38580 762 1                        
336843.75 2495431.25 44315 38580 764 2                        
336843.75 2495443.75 44316 38580 765 1                        
336993.75 2394956.25 36277 38592 765 0                        
336993.75 2394968.75 36278 38592 766 1                        
336993.75 2394981.25 36279 38592 770 4                        

根据上面的结果,我想将文件分成两部分,我之前提到过应该考虑第 6 列中大于 50 的间隙来拆分文件。

我可以使用这个选项

awk '{print> substr($5,1,1)}' file

但它并不总是有效。

输出想要的2个文件

文件 1:

336843.75 2395106.25 36289 38580 660 660                      
336843.75 2395118.75 36290 38580 660 0                        
336843.75 2395131.25 36291 38580 661 1                        
336843.75 2395143.75 36292 38580 662 1                        
336843.75 2395156.25 36293 38580 662 0                        
336843.75 2395168.75 36294 38580 663 1                        
336843.75 2495381.25 44311 38580 665 2

文件 2:

336843.75 2495393.75 44312 38580 760 95
336843.75 2495406.25 44313 38580 761 1
336843.75 2495418.75 44314 38580 762 1
336843.75 2495431.25 44315 38580 764 2
336843.75 2495443.75 44316 38580 765 1                        
336993.75 2394956.25 36277 38592 765 0                        
336993.75 2394968.75 36278 38592 766 1                        
336993.75 2394981.25 36279 38592 770 4   

感谢您的帮助

最佳答案

Awk解决方案:

awk 'BEGIN{ c=1 }{ $6=$5-prev }{ prev=$5 }{ print > "file"(NR>1 && $6 > 50? ++c:c) }' file

结果:

$ head file[12]
==> file1 <==
336843.75 2395106.25 36289 38580 660 660
336843.75 2395118.75 36290 38580 660 0
336843.75 2395131.25 36291 38580 661 1
336843.75 2395143.75 36292 38580 662 1
336843.75 2395156.25 36293 38580 662 0
336843.75 2395168.75 36294 38580 663 1
336843.75 2495381.25 44311 38580 665 2

==> file2 <==
336843.75 2495393.75 44312 38580 760 95
336843.75 2495406.25 44313 38580 761 1
336843.75 2495418.75 44314 38580 762 1
336843.75 2495431.25 44315 38580 764 2
336843.75 2495443.75 44316 38580 765 1
336993.75 2394956.25 36277 38592 765 0
336993.75 2394968.75 36278 38592 766 1
336993.75 2394981.25 36279 38592 770 4

关于linux - 使用列中的引用拆分文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48822086/

相关文章:

awk - jq 仅替换 json 文件的某些行的一部分中多次出现的字符

c++ - 如何将 gstreamer 1.0 视频元素添加到 qt5 应用程序

用于替换新行的正则表达式

bash - 如何输出按用户排序的命令列表?

linux - 上传文件到远程服务器

java - 检查 linux 命令是否输出空字符串

bash - 如何从日期中减去5分钟

linux - 在MAC层访问无线接口(interface)(802.11)(Linux)

linux - Excel函数的命令行执行

linux - 无法启动系统服务