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

时间:2014-08-12 12:12:57

标签: bash shell awk

我试图动态地重写文件,如下所示:

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

没有像我预期的那样工作。我怎样才能做到这一点?最好!

3 个答案:

答案 0 :(得分:5)

使用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分隔,我们将其设置为:,而不是默认的空格。

答案 1 :(得分:2)

怎么样:

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

这将忽略空行和以<{1}}符号开始的行。

如果评论可能以某些空格开头,则您更愿意:

#

答案 2 :(得分:0)

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