我正在尝试从输入文件创建两个文件。输出文件将共享相同的标头信息(取自原始文件),然后我想根据值分配后续行。
目前我被卡住了,因为似乎当一行失败了“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的行被添加两次)
答案 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