Strona 1 z 1

[bash] wyszukiwanie w pliku i wypisywanie

: 07 gru 2010, 16:04
autor: xsonic90
Witam

Mam plik jednostki.txt

Kod: Zaznacz cały

c=1 c=2 b=r h=j g=3 g=4
I teraz tak chciał bym z tego wypisać drugie c czyli 2, pierwsze g czyli 3.
wybieranie zakresu za pomocą had i tail nie pójdzie bo długość tego pliku może się zmienić.

Wielkie dzięki za zainteresowanie

Odp: [bash] wyszukiwanie w pliku i wypisywanie

: 07 gru 2010, 16:11
autor: Dwimenor

Kod: Zaznacz cały

#!/bin/bash

. jednostki.txt
echo $b
Zadziała pod warunkiem, że nie będzie się powtarzać, tzn nie może być dwa razy c, dwa razy g i tak dalej. Możesz nazwać je np

Kod: Zaznacz cały

c_1
c_2
g_1
g_2
i tak dalej

Odp: [bash] wyszukiwanie w pliku i wypisywanie

: 07 gru 2010, 16:16
autor: xsonic90
kurcze musi być coś bardziej szczegółowego żeby uwzględniało czy 1 czy 2 ale dzięki też mi się przyda

Odp: [bash] wyszukiwanie w pliku i wypisywanie

: 07 gru 2010, 16:20
autor: Dwimenor
Jeżeli koniecznie muszą być takie powtarzające się nazwy, to można inaczej (mniej zgrabnie). Taka wersja wymaga aby każda jednostka była w nowej linii.

Kod: Zaznacz cały

#!/bin/bash -x

#pierwsze c
c_1=`grep "c=" jednostki.txt|head -n1|cut -c3-`
echo $c_1
Albo jeden z gazyliona innych sposobów, z których każdy będzie bardziej skomplikowany od mojej pierwszej propozycji.

Odp: [bash] wyszukiwanie w pliku i wypisywanie

: 07 gru 2010, 16:31
autor: xsonic90
dzięki za zainteresowanie jeśli ktoś by miał inny pomysł to proszę o podzielenie się

Odp: [bash] wyszukiwanie w pliku i wypisywanie

: 07 gru 2010, 17:30
autor: borzole
Utwórz tablice i odwołuj się po indeksie np. pierwsze c to ${c[0]}
To jest automat, nazwy zostaną wczytane do tablicy arrays, więc łatwo je można znaleźć. Prawdę mówiąc ta taka namiastka tablicy dwu wymiarowej.

Kod: Zaznacz cały

#!/bin/bash

# zerujemy tablicę, w której będziemy przechowywać nazwy zmiennych
unset arrays

is_new_array(){
	# sprawdza, czy nazwa już istnieje w tablicy
	for v in ${arrays[*]} ; do
		[ $v == $1 ] && return 1
	done
	return 0
}

for p in $(cat ~/jednostki.txt) ; do
	name=$(echo $p | cut -d'=' -f1)
	value=$(echo $p | cut -d'=' -f2)
	# tworzona jest tablica o nazwie $name i wartości $value
	# index tablicy jest automatycznie powiększany
	eval "${name}[\${#${name}[*]}]=$value"
	# jeśli nazwa występuje pierwszy raz, dodawana jest do indeksu tablic
	is_new_array $name && arrays[${#arrays[*]}]=$name
done

echo test: jakie zmienne zostały wczytane:
for v in ${arrays[*]} ; do
	echo tablica $v
done

echo test: jakie wartości przechowują zmienne:
for v in ${arrays[*]} ; do
	echo -n tablica $v :
	for i in $(eval "echo \${$v[*]}") ; do
		echo -n $i,
	done
	echo
done


# do poczytania
# http://www.linuxjournal.com/content/bash-arrays
wyjście z uruchomienia:

Kod: Zaznacz cały

test: jakie zmienne zostały wczytane:
tablica c
tablica b
tablica h
tablica g
test: jakie wartości przechowują zmienne:
tablica c :1,2,
tablica b :r,
tablica h :j,
tablica g :3,4,

Odp: [bash] wyszukiwanie w pliku i wypisywanie

: 07 gru 2010, 19:54
autor: xsonic90
sed had i tail spełniły moje wymagania jeszcze jedno pytanko jak z pliku usunąć spacje

Odp: [bash] wyszukiwanie w pliku i wypisywanie

: 08 gru 2010, 00:05
autor: LukAs
Raczej nadmiar lub zamiana spacji na coś innego.

Kod: Zaznacz cały

tr -s "[ ]" "[ ]"
tr  "[ ]" "_"