2012-07-27 107 views
23

我的脚本的输出被制表符分隔的使用awk为:awk中跳过空行

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 

在此先感谢您的建议和答复。

回答

38

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

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)不为零(即大于零)的行。

第二种方法着眼于线的长度和如果长度是不为零的行为(即,大于零)

可以挑选最适合你的数据/需求的办法。

2

可能是你可以试试这个:

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

试试这个:

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

您可以只添加

/^\s*$/ {next;} 

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

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