首页 > 解决方案 > 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 的行被添加了两次)

标签: awkstring-concatenation

解决方案


好的,这似乎有效,不知道是否有人有任何改进建议?

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

推荐阅读