我试图动态地重写文件,如下所示:
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 }'
没有像我预期的那样工作。我怎样才能做到这一点?最好!
答案 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