2013-06-03 79 views
1

我在他们这样的线路文本文件:bash中,从空间分隔符的文本文件中提取字符串

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”在文件中是唯一的。

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

+0

当你说“使用bash”,你真的这样想的sed,awk中,grep的,等等都是假表?或者是一个可以调用这些工具的shell脚本吗? – bdesham

+0

所有这些在桌子上。通过bash,我的意思不是python,C++,perl等。 – user788171

回答

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 '$' 
+0

这似乎是个诀窍,有没有什么我可以加上这个来抛出前面的$符号? – user788171

+0

:) hehe。我猜你想要..检查我的更新 – hek2mgl

+0

有没有办法逃避$ 10,所以它不会与bash命令行输入混淆? – user788171

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将选择第二个字段。

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"