【问题标题】:How can I use awk to detect lines that have only one field and print it together with the next line?如何使用 awk 检测只有一个字段的行并将其与下一行一起打印?
【发布时间】:2017-05-19 10:48:32
【问题描述】:

我有一个这样写的file.txt(没有开始的点,只有数字):

0 
0.421915 0.420615 192000
0.420397 0.420802 192000
1
0.423915 0.423681 768000
0.421658 0.421474 768000

我想只用一列和下一列。 使用 awk 可以吗?我该怎么做?

谢谢!

【问题讨论】:

  • 至少,显示预期结果应该如何
  • 你的意思是像:11 之后的一行吗?
  • 试试awk 'NF==1{c=2}c-->0'
  • @PS 考虑如果文件很大并且c 环绕负 maxint 会发生什么情况。使用c&&c-- 保护减量,因此减量仅在 c 大于零时发生。

标签: bash awk gnuplot


【解决方案1】:

awk方法:

awk 'NF==1 && (getline nl)>0{print $0 ORS nl}' file

输出:

0
0.421915 0.420615 192000
1
0.423915 0.423681 768000

  • NF==1 - 只考虑一列的行

  • getline nl - 获取下一行并将其分配给变量nl(下一行)

  • (getline nl)>0 - getline 命令在找到记录时返回 10如果遇到文件结尾

  • print $0 ORS nl - 打印只有一列和下一列的行(根据需要)

【讨论】:

  • 解释解决方案 - NF==1 检查记录/行中是否有一个字段默认字段分隔符为空格。当满足这个条件时,下一行被读入变量 nl,然后打印当前行($0)以及默认的记录分隔符 - RS(回车),然后是变量 nl。
  • @RamanSailopal,所以在投票之前你应该被告知
  • 对不起 Roman,不是我降级,我不小心按了 poxy 回车/post。我刚刚编辑过
  • @RamanSailopal,我已经恢复了它。这很棘手,不要那样做)
  • @EdMorton,谢谢,您关于输入文件以单个字段结尾 的假设是合理的(我没有想到这一点)。固定
【解决方案2】:

我会用 grep 来做:

grep -E -A 1 "^[0-9]+$" yourfile.txt

【讨论】:

  • 你不需要使用*,因为它也匹配空行
  • 你说得对,我改成+,谢谢指出
  • 虽然这应该可行,但 OP 发布的输入文本在第一行末尾有一个空格,这将导致此 reg exp 无法检测到。相反,使用"^[0-9]+[ ]*$" 应该可以工作,但还要记住grep 将在连续匹配之间引入-- 分隔线,因此您需要添加类似| grep -v "\-\-" 的内容来删除它们。
【解决方案3】:

你应该可以做到:

awk 'NF==1{p=1;print$0;}NF!=1{if(p==1){print$0;p=0}}' file.txt

输出

0 
0.421915 0.420615 192000
1
0.423915 0.423681 768000

【讨论】:

    【解决方案4】:
    $ awk 'NF==1{c=2} c&&c--' file
    0
    0.421915 0.420615 192000
    1
    0.423915 0.423681 768000
    

    请参阅 https://stackoverflow.com/a/17914105/1745001 以了解有关该内容和更多 awk 范围习语的说明。

    【讨论】:

      猜你喜欢
      • 2023-02-21
      • 1970-01-01
      • 2015-02-11
      • 2021-10-29
      • 1970-01-01
      • 2014-04-07
      • 2020-12-06
      • 1970-01-01
      • 2023-03-07
      相关资源
      最近更新 更多