2013-06-03 7 views
1

У меня есть текстовые файлы с строкой в ​​них:Баша, извлечение строки из текстового файла с разделителем пространства

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

сиг-250-0 является то, что может изменить из файла в файл (но я всегда знаю, что для каждого файла). Есть строки до и выше, но строка «MC exp. Sig-250-0 events» уникальна в файле.

Для конкретного файла есть хороший способ извлечь второе число 3.57 в примере выше, используя bash?

+0

Когда вы говорите, «с помощью Bash», вы на самом деле означает, что SED, AWK, Grep и т.д. со стола? Или скрипт оболочки, который вызывает эти инструменты в порядке? – 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 вам нужна вспомогательная оболочка $(). Как это:

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

Если вы хотите передать переменную оболочки в шаблон AWK использовать следующий синтаксис:

awk -v p="MC exp. sig-$p" '/p/ {print $10}' a.txt | tr -d '$' 
+0

Это похоже на трюк, есть ли что-то, что я могу с этим связать, чтобы выбросить знак $ спереди? – user788171

+0

:) хе-хе. Я догадался, что вы этого хотите .. проверить мое обновление – hek2mgl

+0

Есть ли способ избежать $ 10, чтобы он не путался с вводом командной строки bash? – user788171

0

Больше линий уже было бы хорошо, но я предполагаю, что вы хотели бы иметь простой использование awk.

awk '{print $N}' $file 

Если вы не говорите AWK, какие поля сепаратора он должен использовать это будет использовать только пространство «». Теперь вам просто нужно подсчитать, сколько полей у вас есть, чтобы получить свое поле, которое вы хотите получить. В вашем случае это будет 10.

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

Не хотите $? Pipe ваш результат 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"