bash i potoki

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
aksnet
Posty: 51
Rejestracja: 25 maja 2013, 13:44
Lokalizacja: ifb0

bash i potoki

Post autor: aksnet » 04 października 2017, 12:07

mam plik z danymi np. data.txt i skrypt format.sh

formatowanie danych uruchamiam tak:

Kod: Zaznacz cały

./data.txt | format.sh
skrypt format.sh czyta linia po linii plik data.sh przetwarza go
np. w pętli

Kod: Zaznacz cały

while read line; do
    echo $line
    ...
done
czy po zakończeniu takiej pętli w skrypcie
jest jakaś możliwość czytania potoku znów od początku?

Awatar użytkownika
dedito
Moderator
Posty: 2245
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: bash i potoki

Post autor: dedito » 04 października 2017, 13:44

Jak najbardziej, ta składnia wywołania jakaś dziwna.
Czemu w samym skrypcie nie zaciągasz tego pliku do formatowania?

Awatar użytkownika
aksnet
Posty: 51
Rejestracja: 25 maja 2013, 13:44
Lokalizacja: ifb0

Re: bash i potoki

Post autor: aksnet » 04 października 2017, 14:09

Ty chyba powinno być oczywiste.

Po to żeby skrypt format.sh uruchomić dla dowolnego pliku
bez niepotrzebnego edytowania format.sh

Awatar użytkownika
lizard
Beginner
Posty: 210
Rejestracja: 08 lutego 2016, 18:47

Re: bash i potoki

Post autor: lizard » 04 października 2017, 14:14

Możesz podać plik z danymi jako parametr skryptu "format.sh data.txt" i odwoływać się do niego:

Kod: Zaznacz cały

InData="${1}"
while read Line; do
  echo "${Line}"
done < "${InData}"
Możesz też czytać ze standardowego wejścia, jak do tej pory, a wszystko, co odczytasz zapisywać do pliku tymczasowego i sięgać, gdy zajdzie taka potrzeba:

Kod: Zaznacz cały

TmpFile="$(mktemp /tmp/format.sh-XXXX)"
> "${TmpFile}"
while read Line; do
  echo "${Line}" >> "${TmpFile}"
  :
done

while read Line; do
  echo "${Line}"
done < "${TmpFile}"
:
rm -f "${TmpFile}"
:
Ciekawy pomysł na wielokrotne wykorzystanie w pętli ostatnio odczytanej linii jest ns Stack Overflow:

Kod: Zaznacz cały

recycle=false
some_command | while $recycle || read line
do
  if something then
    read line
    recycle=false
  else
    # how do I "unread"?
    recycle=true
  fi
done

Awatar użytkownika
dedito
Moderator
Posty: 2245
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: bash i potoki

Post autor: dedito » 04 października 2017, 14:22

aksnet pisze:
04 października 2017, 14:09
Ty chyba powinno być oczywiste.

Po to żeby skrypt format.sh uruchomić dla dowolnego pliku
bez niepotrzebnego edytowania format.sh
Oczywiste to by było gdybyś wywoływał jak to @Lizard pokazał na przykładzie wywołania argumentu $1

ODPOWIEDZ