2

I have a text files with a line like this in them:

    MC exp. sig-250-0 events         & $0.98 \pm 0.15$          & $3.57 \pm 0.23$              \\

sig-250-0 is something that can change from file to file (but I always know what it is for each file). There are lines before and above this, but the string "MC exp. sig-250-0 events" is unique in the file.

For a particular file, is there a good way to extract the second number 3.57 in the above example using bash?

4

3 回答 3

3

用于awk此:

awk '/MC exp. sig-250-0/ {print $10}' your.txt 

请注意,这将打印:$3.57- 带有前导$,如果您不喜欢这样,请将输出通过管道传输到tr

awk '/MC exp. sig-250-0/ {print $10}' your.txt | tr -d '$'

在您写的评论中,您需要在这样的脚本中调用它:

while read p ; do 
    echo $p,awk '/MC exp. sig-$p/ {print $10}' filename | tr -d '$'
done < grid.txt

请注意,您需要一个$()用于 awk 管道的子 shell。像这样:

echo "$p",$(awk '/MC exp. sig-$p/ {print $10}' filename | tr -d '$')

如果要将 shell 变量传递给 awk 模式,请使用以下语法:

awk -v p="MC exp. sig-$p" '/p/ {print $10}' a.txt | tr -d '$'
于 2013-06-03T16:01:50.720 回答
1

更多的行会很好,但我想你想要一个简单的使用 awk。

awk '{print $N}' $file

如果你不告诉 awk 它必须使用什么样的字段分隔符,它将只使用一个空格 ' '。现在你只需要计算你有多少字段来获得你想要的字段。在您的情况下,它将是 10。

awk '{print $10}' file.txt 
$3.57

不想要美元?通过管道将您的 awk 结果剪切:

awk '{print $10}' foo | cut -d $ -f2

-d 将使用 $ als 字段分隔符,-f 将选择第二个字段。

于 2013-06-03T16:14:25.850 回答
0

如果你知道你总是有相同数量的字段,那么

#!/bin/bash
file=$1
key=$2
while read -ra f; do
    if [[ "${f[0]} ${f[1]} ${f[2]} ${f[3]}" == "MC exp. $key events" ]]; then
        echo ${f[9]}
    fi
done < "$file"
于 2013-06-03T19:27:19.740 回答