繁体   English   中英

使用带有字段分隔符的AWK解析文件-无法正确解析

[英]parsing of files using AWK with field-separators - does not parse correctly

我有一个文件,其中包含用D **>子字符串分隔的数据。 看起来像这样:

一些文字在这里...

text: nnD**>24%
text: nnD**>25%
text: nnD**>22%
text: nnD**>3%

一些文字在这里...

nn代表浮点数(0.25或9.769-没关系),我需要将%值的序列放入一个单独的文件中:24、25、22、3 ....因此,我执行了以下操作:

`read B1 <<<$(cat FILE_NAME | awk 'BEGIN {FS="D**>" {print $2}')`
`eecho -e "$B1"`

尝试获取以下列表:24%,25%,22%...

但它无法正确解析-它只是使文件中的许多其他字符串无效。 如果我这样做:

read B1 <<<$(cat FILE_NAME | awk 'BEGIN {FS="*>" {print $2}')

它正常工作。 有人可以向我解释什么问题吗?

字段分隔符FS值是一个正则表达式,因此特殊字符(如*需要转义。 尝试这样的事情:

read B1 <<< $(awk 'BEGIN {FS="D[*][*]>"} {print $2}' FILE_NAME)

我认为您专注于输入错误的部分。 “>”之前的数字和星号无关紧要。 您应该使用这样的东西:

awk -F'[>%]' '{print $2}' oldfile > newfile

这会将输入字段分隔符设置为“>”或“%”,并打印第二个字段(您感兴趣的数字)。 输出将重定向到newfile

然后, newfile的内容将是:

24
25
22
3

FS="D**>"Set the FS to the character D repeated zero or more times, repeated zero or more times again因为*是代表可选重复的RE元字符,因此Set the FS to the character D repeated zero or more times, repeated zero or more times again

这没有任何意义,因此,如果您想将FS设置为the character D followed by the character * followed by the character *则写入的方式将是FS="D\\\\*\\\\*"FS="D[*][*]"使* s按字面意义处理,而不是RE元字符。

我真的不明白您要使用脚本的其余部分做什么,但是我怀疑您最好只用一个awk命令来完成所有操作。 如果您只是想在一行上获取所有百分比值:

$ awk -F'D[*][*]>' '{printf "%s%s", (NR>1?OFS:""), $2} END{print ""}' file
24% 25% 22% 3%

如果要删除%符号,请执行以下操作:

$ awk -F'D[*][*]>' '{printf "%s%s", (NR>1?OFS:""), $2+0} END{print ""}' file
24 25 22 3

并且如果您想用分隔它们,而不仅仅是空格:

$ awk -F'D[*][*]>' -v OFS=', ' '{printf "%s%s", (NR>1?OFS:""), $2+0} END{print ""}' file
24, 25, 22, 3

除了awk ,还可以使用sed解决此问题:

$ B1=$(sed -n 's/.*D\*\*>\(.*%\)/\1/p' input_file)
$ echo $B1
24% 25% 22% 3%

read内置命令不会按您期望的方式读取多行输入。

read B1 < <(awk 'BEGIN{FS="D**>"}{print $2}' FILE_NAME)

只会将24%分配给变量B1因为read仅从第一行获取输入。

为了从Awk命令捕获多行输出并将其分配给Bash变量,我将使用进程替换。

B1=$(awk 'BEGIN{FS="D**>"}{print $2}' FILE_NAME)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM