我的脚本输出使用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
。我了解sed
和tr
的方式,但我希望awk
在上述命令本身中完成,而不是像下面这样的单独解决方案或管道解决方案。
sed '/^$/d' myinfile.c
tr -s "\n" < myinfile.c
提前感谢您的建议和回复。
7条答案
按热度按时间zbq4xfa01#
您可以尝试两种方法来过滤线:
以及
把这些放在命令的开头,即,
或
这两种语句都充当看门人/if语句。
第一种方法通过只打印字段数(
NF
)不为零(即大于零)的行来工作。第二种方法查看行长度,如果长度不为零(即大于零),则采取行动
您可以选择最适合您的数据/需求的方法。
tv6aics12#
你可以加上
在脚本的前面,它将匹配空行并跳过awk匹配规则的其余部分。
kh212irz3#
也许你可以试试这个
5anewei64#
试试这个:
n3schb8v5#
我还没有见过这个解决方案,所以:
awk '!/^\s*$/{print $1}'
将运行所有非空行的块。\s
元字符并非在所有awk实现中都可用,但您也可以写入!/^[ \t]*$/
。https://www.gnu.org/software/gawk/manual/gawk.html
\s匹配当前区域设置定义的任何空格字符。请将其视为“:space:”的简写。
h9a6wy2h6#
根据Levon的回答,您可以在命令末尾添加
| awk 'length { print $1 }'
。所以改变
到
如果这不起作用,请改用
| awk 'NF { print $1 }'
。qkf9rpyu7#
另一种
awk
方法是只修剪掉实际长度为零的行,但保留只有空格制表符的行:仅执行
awk NF
就可以修剪掉第3行(zero length
)和第5行(spaces and tabs
).....但是
RS=
方法保持第5行用于u:**默认情况下不跳过包含
\013 \v VT :: \014 \f FF :: \015 \r CR
的行,尽管它们也属于POSIX [[:space:]]