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 № 1posł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"