31

我的脚本的输出是使用制表符分隔的awkas :

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

awk命令在 while 循环中运行,该循环会在每个循环中更新变量值和文件 myinfile.c。我用这个命令得到了预期的结果。但是如果 inmyfile.c 包含一个空行(它可以包含)它不会打印任何相关信息。我可以告诉awk忽略空行吗?

我知道可以通过从 myinfile.c 中删除空行来完成,然后再将其传递给awk. 我知道sedtr方式,但我想awk在上面提到的命令本身中做到这一点,而不是下面的单独解决方案或管道解决方案。

sed '/^$/d' myinfile.c
tr -s "\n" < myinfile.c

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

4

4 回答 4

61

有两种方法可以尝试过滤掉行:

awk 'NF' data.txt

awk 'length' data.txt

只需将这些放在命令的开头,即

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

或者

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

这两者都充当看门人/if 语句。

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

第二种方法查看行长度,如果长度不为零(即大于零)则采取行动

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

于 2012-07-27T11:54:24.940 回答
11

你可以添加

/^\s*$/ {next;}  

到脚本的前面,它将匹配空行并跳过其余的 awk 匹配规则。把它们放在一起:

awk -v variable=$bashvariable '/^\s*$/ {next;} {print variable"\t single\t" $0"\t double"}' myinfile.c
于 2012-07-27T11:56:58.017 回答
2

也许你可以试试这个:

awk -v variable=$bashvariable  '$0{print variable"\t single\t" $0"\t double"}' myinfile.c
于 2012-07-27T11:54:52.290 回答
1

试试这个:

awk -v variable=$bashvariable '/^.+$/{print variable"\t single\t" $0"\t double"}' myinfile.c
于 2012-07-27T11:54:57.457 回答