awk - awk,将文件中的行分成两个输出字符串
问题描述
我正在尝试从输入文件创建两个文件。输出文件将共享相同的标题信息(取自原始文件),然后我想根据一个值分配后续行。
目前我被卡住了,因为似乎当一行未能通过“if”语句时,我认为它的最后一个值仍然被添加。
我的输入看起来像这样:-
#START STOP INFO
1 100 700 Q=2;S=40;LENGTH=600
2 300 350 Q=5;S=50;LENGTH=50
3 567 601 Q=3;S=2;LENGTH=34
我的代码如下所示:-
awk -v short="" -v long="" 'BEGIN{FS="\t"}{if ($1 !~/#/) {sub(/.*LENGTH=/, ""); sub(/;.*/, ""); if ($NF >= 500 ) { long=$0 }} else { long=$0; short=$0 }}{print long}' test.txt
我的长文件输出如下所示:-
#START STOP INFO
1 100 700 Q=2;S=40;LENGTH=600
1 100 700 Q=2;S=40;LENGTH=600
1 100 700 Q=2;S=40;LENGTH=600
短文件的输出如下所示:-
#START STOP INFO
#START STOP INFO
#START STOP INFO
而我想要“长”应该看起来像: -
#START STOP INFO
1 100 700 Q=2;S=40;LENGTH=600
而“短”是:-
#START STOP INFO
2 300 350 Q=5;S=50;LENGTH=50
3 567 601 Q=3;S=2;LENGTH=34
(即接下来两行的长度值小于 500,因此应该添加到“短”字符串中,但由于某种原因,前一行 - 大于 500 的行被添加了两次)
解决方案
好的,这似乎有效,不知道是否有人有任何改进建议?
awk -v short="" -v long="" '{if ($1 ~/#/){long = long "\n" $0; short = short "\n" $0} else { line=$0; sub(/.*LENGTH=/, ""); sub(/;.*/, ""); if ( $NF >= 500 ){long = long "\n" line } else { short = short "\n" line}}}END{print long, short}' test.txt
推荐阅读
- javascript - 使用 Window.getSelection() 粗体/取消粗体选定的文本
- java - 使用arraylist读取.txt文件时如何忽略主文件夹中的某些文件
- nginx - Nginx proxy_set_header 含义
- c# - 如何制作具有透明度的背景图像的按钮?
- c++ - 在堆上创建对象时在哪里创建成员变量?
- python - 根据每组sqlalchemy中的时间范围进行过滤
- php - 向部分添加唯一类(PHP)
- netlogo - Netlogo,如何捕获海龟变量的值并添加每个海龟值,映射它们,并将它们减少为单个#
- unicode - 在同一个单词中使用 Word Joiner (U+2060) 是否正确?
- c# - 如何在 ASMX Web 服务中接收 JSON 数据