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

Mac*_*ers 1 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
.....
Run Code Online (Sandbox Code Playgroud)

从最初的,分离归档到:分离的归档.所以,我用过这个:

awk -F', ' 'BEGIN{OFS=":";} { $1=$1; print }'
Run Code Online (Sandbox Code Playgroud)

这几乎是有效的,但该文件也有一些空白和注释掉的行,我也想排除.我的尝试:

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

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

jay*_*ngh 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
Run Code Online (Sandbox Code Playgroud)

或者你可以这样设置OFS:

awk -F', ' -v OFS=':' '!/^#/ && NF{$1=$1; print}' file
Run Code Online (Sandbox Code Playgroud)

甚至

awk -F', ' '!/^#/ && NF{$1=$1; print}' OFS=':' file
Run Code Online (Sandbox Code Playgroud)

正如Ed Morton在评论中所建议的那样,对于一个边缘情况,你可能有空间,#最好使用以下内容:

awk -F', ' 'BEGIN{OFS=":"} !/^[[:space:]]*#/ && NF{$1=$1; print}' file
Run Code Online (Sandbox Code Playgroud)

说明:

$1=$1重建$0变量.它接受所有字段并将它们连接起来,OFS我们将其设置为:而不是默认的空格.

  • +1但是`!/ ^ [[:space:]]*#/ ...`可能会更安全,以防在评论开始符号之前有空白空格. (3认同)