awk,将文件中的行分成两个输出字符串

时间:2018-05-03 16:09:18

标签: awk string-concatenation

我正在尝试从输入文件创建两个文件。输出文件将共享相同的标头信息(取自原始文件),然后我想根据值分配后续行。

目前我被卡住了,因为似乎当一行失败了“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的行被添加两次)

2 个答案:

答案 0 :(得分:0)

好吧,这似乎有用,不确定是否有人有任何改进建议?

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

答案 1 :(得分:0)

我认为您打算做的事情如下:

awk -v long="longfile.txt" -v short="shortfile.txt" \
    -v val=500 -F "="                               \
    '/^#/{ print > long; print > short } # print header
    ($NF>val) { print > long; next }     # print long file
    { print > short }' <file>            # print short file