/ / bash, wyodrębnij ciąg z pliku tekstowego z ogranicznikiem przestrzeni - string, bash, extract

bash, wyodrębnij ciąg z pliku tekstowego z ogranicznikiem przestrzeni - string, bash, extract

Mam pliki tekstowe z taką linią:

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

sig-250-0 to coś, co można zmienić z plikudo pliku (ale zawsze wiem, co to jest dla każdego pliku). Istnieją linie przed i powyżej tego, ale ciąg "MC exp. Sig-250-0 events" jest unikalny w pliku.

W przypadku konkretnego pliku istnieje dobry sposób na wyodrębnienie drugiej liczby 3.57 w powyższym przykładzie przy użyciu bash?

Odpowiedzi:

3 dla odpowiedzi № 1

posługiwać się awk dla tego:

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

Zauważ, że to wydrukuje: $3.57 - z prowadzeniem $, Jeśli nie podoba ci się to, wyprowadź wyjście do tr:

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

W komentarzach, które napisałeś, musisz wywołać to w skrypcie:

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

Zauważ, że potrzebujesz podrzędnej powłoki $() dla rury awk. Lubię to:

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

Jeśli chcesz przekazać zmienną powłoki do wzoru awk, użyj następującej składni:

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

0 dla odpowiedzi nr 2

Więcej linii byłoby fajnie, ale myślę, że chciałbyś mieć proste awk.

awk "{print $N}" $file

Jeśli nie powiesz awk, jaki rodzajseparator pól, z którego musi korzystać, użyje tylko spacji "". Teraz musisz tylko policzyć, ile pól masz, aby uzyskać swoje pole, które chcesz zdobyć. W twoim przypadku będzie to 10.

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

Nie chcesz $? Potnij swój wynik awk, aby wyciąć:

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

-d użyje separatora pól $ als, a -f wybierze drugie pole.


0 dla odpowiedzi № 3

Jeśli wiesz, że zawsze masz taką samą liczbę pól, to

#!/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"