Bash 如何使用awk检测只有一个字段的行并将其与下一行一起打印?

Bash 如何使用awk检测只有一个字段的行并将其与下一行一起打印?,bash,awk,gnuplot,Bash,Awk,Gnuplot,我以这种方式编写了一个file.txt(没有起始点,只有数字): 我想用一行,只有一列,下面一列。 使用awk可以吗?我怎么做 谢谢大家! 我会用grep来做: grep-E-A 1“^[0-9]+$”yourfile.txt您应该能够使用以下工具完成此操作: 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 768

我以这种方式编写了一个file.txt(没有起始点,只有数字):

我想用一行,只有一列,下面一列。 使用awk可以吗?我怎么做


谢谢大家!

我会用grep来做:


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

您应该能够使用以下工具完成此操作:

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
短程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命令返回1,如果遇到文件结尾,则返回0

  • 打印$0或nl
    -仅打印一列和下一列的行(根据需要)


<> P>参见解释这个和多个AWK范围的习惯用法。

至少显示出期待的结果。你的意思是:1和1之后的一行吗?试试<代码> AWK 'NF==1 { C=2 } C>0’< /Calp>@ ps,如果文件巨大,代码< C >代码>包围负MaxTt,会发生什么情况。使用
c&&c--
保护减量,因此减量仅在c大于零时发生。您无需使用
*
,因为它也与空行匹配您是对的,我将它更改为
+
,感谢您指出它,尽管这应该可以工作,OP发布的输入文本在第一行末尾有一个空格,这将导致此reg exp无法检测。相反,使用
“^[0-9]+[]*$”
应该可以,但也要记住
grep
将在连续的匹配之间引入一个
--
分隔线,因此您需要添加类似
的内容
删除它们。要解释解决方案-NF==1检查记录/行中是否有一个字段具有默认的空格字段分隔符。当满足此条件时,下一行被读入变量nl,然后打印当前行($0)以及默认的记录分隔符-RS(回车),然后是变量nl。@RamanSailopal,所以在降级之前应该告诉您对不起,Roman,不是我降级,我无意中按下了poxy回车键。我刚刚edited@RamanSailopal,我找到了。这很棘手,不要那样做)@EdMorton,谢谢,你关于输入文件以单个字段结尾的假设是合理的(我没想到)。固定的
0
0.421915 0.420615 192000
1
0.423915 0.423681 768000
$ awk 'NF==1{c=2} c&&c--' file
0
0.421915 0.420615 192000
1
0.423915 0.423681 768000