我正在尝试即时重写文件,如下所示:
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