【问题标题】:awk, dividing lines in a file into two output stringsawk,将文件中的行分成两个输出字符串
【发布时间】:2018-05-03 16:09:17
【问题描述】:

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

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

【问题讨论】:

  • 欢迎来到 Stack Overflow!感谢您发布。你能告诉我们输入是什么样的吗?
  • 谢谢,实际上已经发布了一段时间 - 它以前总是被证明很有用!我的输入基本上看起来像(虽然我无法显示换行符..每个都应该在一个新行上):-#LENGTH 600 100 200

标签: awk string-concatenation


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我相信你打算做的是:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多