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

时间:2014-08-11 01:41:32

标签: bash awk

我有一个文件,其中包含由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"`

exptect得到这样的列表:24%,25%,22%......

但它没有正确解析它 - 它只是在文件中输入很多其他字符串。 如果我喜欢这样:

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

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

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

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

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

newfile的内容将是:

24
25
22
3

答案 2 :(得分:1)

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

这没有任何意义,所以如果您想要将FS设置为the character D followed by the character * followed by the character *,那么编写FS="D\\*\\*"FS="D[*][*]"的方式可以*字面上而不是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

答案 3 :(得分:0)

除了awk之外,sed

也可以解决此问题
$ B1=$(sed -n 's/.*D\*\*>\(.*%\)/\1/p' input_file)
$ echo $B1
24% 25% 22% 3%

答案 4 :(得分:0)

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)