regex Awk跳过空行

n8ghc7c1  于 2022-12-30  发布在  其他
关注(0)|答案(7)|浏览(129)

我的脚本输出使用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

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

zbq4xfa0

zbq4xfa01#

您可以尝试两种方法来过滤线:

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)不为零(即大于零)的行来工作。
第二种方法查看行长度,如果长度不为零(即大于零),则采取行动
您可以选择最适合您的数据/需求的方法。

tv6aics1

tv6aics12#

你可以加上

/^\s*$/ {next;}

在脚本的前面,它将匹配空行并跳过awk匹配规则的其余部分。

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

kh212irz3#

也许你可以试试这个

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

5anewei64#

试试这个:

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

n3schb8v5#

我还没有见过这个解决方案,所以:awk '!/^\s*$/{print $1}'将运行所有非空行的块。\s元字符并非在所有awk实现中都可用,但您也可以写入!/^[ \t]*$/
https://www.gnu.org/software/gawk/manual/gawk.html
\s匹配当前区域设置定义的任何空格字符。请将其视为“:space:”的简写。

h9a6wy2h

h9a6wy2h6#

根据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 }'

qkf9rpyu

qkf9rpyu7#

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

awk 8 RS=

仅执行awk NF就可以修剪掉第3行(zero length)和第5行(spaces and tabs).....
但是RS=方法保持第5行用于u:

**默认情况下不跳过包含\013 \v VT :: \014 \f FF :: \015 \r CR的行,尽管它们也属于POSIX [[:space:]]

相关问题