2013-06-03 80 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"