使用Awk跳过空行

33

我的脚本的输出是使用 awk 进行制表符分隔的:

awk -v variable=$bashvariable  '{print variable"\t single\t" $0"\t double"}' myinfile.c
awk命令在while循环中运行,每个周期更新变量值和文件myinfile.c。使用此命令可以获得预期的结果。但是,如果myfile.c包含空行(可能会包含),它将不打印有关信息。我能告诉awk忽略空行吗?
我知道可以通过从myinfile.c中删除空行来完成这项工作,我了解sed和tr的方式,但我希望awk在上述命令本身中执行它,而不是作为下面的单独解决方案或管道解决方案。
sed '/^$/d' myinfile.c
tr -s "\n" < myinfile.c

感谢您提前给予的建议和回复。

7个回答

68

你可以尝试两种方法来过滤行:

awk 'NF' data.txt
并且。
awk 'length' data.txt

只需在您的命令开头添加这些内容,即:

awk -v variable=$bashvariable 'NF { print variable ... }' myinfile
或者
awk -v variable=$bashvariable 'length { print variable  ... }' myinfile

这两种方法都像是门卫/条件语句。

第一种方法的作用是只打印字段数(NF)不为零(即大于零)的行。

第二种方法检查行的长度,并在长度不为零(即大于零)时执行操作。

你可以选择最适合你数据/需求的方法。


11
您可以直接添加:

/^\s*$/ {next;}  

在你的脚本前加入一个匹配空行并跳过awk匹配规则的代码。将所有内容组合在一起:
awk -v variable=$bashvariable '/^\s*$/ {next;} {print variable"\t single\t" $0"\t double"}' myinfile.c

2
也许你可以尝试这个:
awk -v variable=$bashvariable  '$0{print variable"\t single\t" $0"\t double"}' myinfile.c

当要读取的行只包含 ASCII 中的 "0""-0""0.0000" 等内容时,您的解决方案会出现问题(基本上是任何 awk 要过于聪明并帮您进行数字解释的情况): echo "0" | awk -v variable=$bashvariable '$0{print variable"\t single\t" $0"\t double"}' < nothing gets printed. new shell prompt > % - RARE Kpop Manifesto

1

试试这个:

awk -v variable=$bashvariable '/^.+$/{print variable"\t single\t" $0"\t double"}' myinfile.c

0
根据Levon的回答,您可以在命令的末尾添加 | awk 'length { print $1 }'
所以更改为:
awk -v variable=$bashvariable  '{ whatever }' myinfile.c

awk -v variable=$bashvariable  '{ whatever }' myinfile.c | awk 'length { print $1 }'

如果这个不起作用,可以使用 | awk 'NF { print $1 }'

0

另一种仅修剪实际零长度行但保留只有空格制表符的awk方法是:

awk 8 RS= 

只需执行awk NF即可修剪出第3行(零长度)和第5行(空格和制表符)……

 1   abc 
 2  def
 3  
 4   3591952
 5          
 6   93253
         1   abc 
         2  def
    
         3   3591952
         4          
         5   93253
 
 1   abc 
 2  def
 3   3591952
 4   93253

但是 RS= 方法会保留第5行中的u:

 1   abc 
 2  def
 3   3591952
 4          
 5   93253

**带有\013 \v VT :: \014 \f FF :: \015 \r CR的行默认情况下不会被跳过FS = " ",尽管它们也属于POSIX [[:space:]]


0
我还没有看到这个解决方案,所以:awk '!/^\s*$/{print $1}'将运行所有非空行的块。\s元字符在所有awk实现中都不可用,但您也可以编写!/^[ \t]*$/

https://www.gnu.org/software/gawk/manual/gawk.html

\s 匹配当前语言环境下定义的任何空格字符。可以将其视为“[[:space:]]”的简写形式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接