Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash AWK:如何使用OFS忽略空白和注释掉的行_Bash_Shell_Awk - Fatal编程技术网

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,已将您的建议添加到答案中。讽刺的是,作为一名测试人员,我甚至没有想到这一点。