AWK:如何使用 OFS 忽略空白和注释掉的行



我正在尝试即时重写文件,如下所示:

10.213.20.173, mem_chld, p3b-aggr-103, c3.xlarge, db, mysql
#10.213.20.191, mem_leaf, p3b-leaf-101, r3.xlarge, db, mysql
10.213.20.192, mem_leaf, p3b-leaf-102, r3.xlarge, db, mysql
10.213.20.190, mem_leaf, p3b-leaf-103, r3.xlarge, db, mysql
.....

从原来的,分离的归档到:分离的归档。所以,我用了这个:

awk -F', ' 'BEGIN{OFS=":";} { $1=$1; print }'

这几乎可以工作,但该文件也有一些空白和注释掉的行,我也想排除这些行。我的尝试:

awk -F', ' '!/^(#|$)/ {OFS=":";} { $1=$1; print }'

没有像我预期的那样工作。我该怎么做?最好!

使用 awk

$ awk -F', ' 'BEGIN{OFS=":"} !/^#/ && NF{$1=$1; print}' file
10.213.20.173:mem_chld:p3b-aggr-103:c3.xlarge:db:mysql
10.213.20.192:mem_leaf:p3b-leaf-102:r3.xlarge:db:mysql
10.213.20.190:mem_leaf:p3b-leaf-103:r3.xlarge:db:mysql

或者,您可以设置如下OFS

awk -F', ' -v OFS=':' '!/^#/ && NF{$1=$1; print}' file

甚至

awk -F', ' '!/^#/ && NF{$1=$1; print}' OFS=':' file

正如 Ed Morton 在评论中建议的那样,对于在#之前可能有空间的边缘情况,最好使用以下方法:

awk -F', ' 'BEGIN{OFS=":"} !/^[[:space:]]*#/ && NF{$1=$1; print}' file

解释:

$1=$1重新生成$0变量。它采用所有字段并连接它们,由我们设置为:OFS分隔,而不是默认的空格。

怎么样:

awk -F', ' -v OFS=':' '/^[^#]/ {$1=$1; print}' datafile

这将忽略空行和以#符号开头的行。

如果注释前面可能有一些空格,则首选:

awk -F', ' -v OFS=':' '!/^[ t]*(#.*)?$/ {$1=$1; print}' datafile
awk -F', ' -v OFS=: '/^[ t]*(#|$)/{next}{$1=$1}1' file

输出:

10.213.20.173:mem_chld:p3b-aggr-103:c3.xlarge:db:mysql
10.213.20.192:mem_leaf:p3b-leaf-102:r3.xlarge:db:mysql
10.213.20.190:mem_leaf:p3b-leaf-103:r3.xlarge:db:mysql

最新更新