Bash AWK:如何使用OFS忽略空白和注释掉的行
我正在尝试动态重写一个文件,如下所示:Bash AWK:如何使用OFS忽略空白和注释掉的行,bash,shell,awk,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
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 -F', ' -v OFS=':' '/^[^#]/ {$1=$1; print}' datafile
这将忽略空行和以#
符号开头的行
如果注释前面可能有一些空格,您希望:
awk -F', ' -v OFS=':' '!/^[ \t]*(#.*)?$/ {$1=$1; print}' datafile
那么:
awk -F', ' -v OFS=':' '/^[^#]/ {$1=$1; print}' datafile
这将忽略空行和以#
符号开头的行
如果注释前面可能有一些空格,您希望:
awk -F', ' -v OFS=':' '!/^[ \t]*(#.*)?$/ {$1=$1; print}' datafile
输出:
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
输出:
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
使用
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
正如注释中所建议的,对于在
前面可能有空格的边缘情况,最好使用以下选项:
awk -F', ' 'BEGIN{OFS=":"} !/^[[:space:]]*#/ && NF{$1=$1; print}' file
说明:
$1=$1
重建$0
变量。它接受所有字段并将它们连接起来,由设置为:
的OFS
分隔,而不是默认的空格 使用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
正如注释中所建议的,对于在
前面可能有空格的边缘情况,最好使用以下选项:
awk -F', ' 'BEGIN{OFS=":"} !/^[[:space:]]*#/ && NF{$1=$1; print}' file
说明:
$1=$1
重建$0
变量。它接受所有字段并将它们连接起来,由设置为:
的OFS
分隔,而不是默认的空格 你能添加一个“注释掉”行的实际示例吗?@SylvainLeroux:编辑我的OP以反映“空白”和“注释”行。令人担忧的是,你想用替换开始/^(#|$)/
可能适合您,并且在较小程度上您不知道可以使用-v
设置OFS
。这表明完全缺乏对awk基本原理的理解。如果你正在考虑用Awk做其他事情的话,你至少应该读一读阿诺德·罗宾斯的《有效的Awk编程,第三版》一书的前几章。@Ed Morton:我不认为它会在我删除BEGIN时起作用,这只是我在想法枯竭时尝试过的事情之一。谢谢你的书。“完全缺乏对awk的理解”可能有点苛刻,但嘿,我们都经历了“学习阶段”——对吗?我同意我需要更多地阅读AWK。最好的!很抱歉,这让人觉得很苛刻,但是关于awk,您需要知道的基本点是,每个脚本都是一系列{}
语句,你明确地说,当你将开始
条件替换为你想要应用于每一行的条件时,并没有像我预期的那样工作
,在我听来,你只是在乱翻代码,不知道它们做了什么,也不知道它们为什么必须在特定的位置。无论如何,除了潜伏在comp.lang.awk新闻组之外,这本书是学习awk的最佳资源,所以一切都好!你能添加一个“注释掉”行的实际示例吗?@SylvainLeroux:编辑我的OP以反映“空白”和“注释”行。令人担忧的是,你想用替换开始/^(#|$)/
可能适合您,并且在较小程度上您不知道可以使用-v
设置OFS
。这表明完全缺乏对awk基本原理的理解。如果你正在考虑用Awk做其他事情的话,你至少应该读一读阿诺德·罗宾斯的《有效的Awk编程,第三版》一书的前几章。@Ed Morton:我不认为它会在我删除BEGIN时起作用,这只是我在想法枯竭时尝试过的事情之一。谢谢你的书。“完全缺乏对awk的理解”可能有点苛刻,但嘿,我们都经历了“学习阶段”——对吗?我同意我需要更多地阅读AWK。最好的!很抱歉,这让人觉得很苛刻,但是关于awk,您需要知道的基本点是,每个脚本都是一系列{}
语句,你明确地说,当你将开始
条件替换为你想要应用于每一行的条件时,并没有像我预期的那样工作
,在我听来,你只是在乱翻代码,不知道它们做了什么,也不知道它们为什么必须在特定的位置。无论如何,除了潜伏在comp.lang.awk新闻组之外,这本书是学习awk的最佳资源,所以一切都好!你能解释一下NF{…}
bit请吗?@MacUsers当然,NF
是一个awk
内置变量,设置为字段数。保留NF
作为一个条件允许我们跳过空行,因为空行的NF
值为0,这实际上使空行为假。+1但/^[[:space:][]*#/…
如果在注释开始符号前有前导空格,可能会更安全。谢谢@EdMorton,已将您的建议添加到答案中。讽刺的是,作为一名测试人员,我甚至没有想到这一点。谢谢你一如既往地照顾我:)
你能解释一下NF{…}
位吗?@MacUsers当然,NF
是一个awk
内置变量,设置为字段数。保留NF
作为一个条件允许我们跳过空行,因为空行的NF
值为0,这实际上使空行为假。+1但/^[[:space:][]*#/…
如果在注释开始符号前有前导空格,可能会更安全。谢谢@EdMorton,已将您的建议添加到答案中。讽刺的是,作为一名测试人员,我甚至没有想到这一点。