bash,使用空格分隔符从文本文件中提取字符串

时间:2013-06-03 15:58:31

标签: string bash extract

我的文本文件中包含这样的行:

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

sig-250-0可以在不同文件之间进行更改(但我总是知道每个文件的内容)。此前后有行,但字符串“MC exp.sig-250-0 events”在文件中是唯一的。

对于特定文件,是否有一种很好的方法可以使用bash在上面的示例中提取第二个数字3.57?

3 个答案:

答案 0 :(得分: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 '$'

答案 1 :(得分:0)

更多的线条会很好但我想你想要一个简单的使用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将选择第二个字段。

答案 2 :(得分: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"