[+] Bash sortowanie według daty z każdej linii

Potrzebujesz pomocy z C, C++, perl, python, itp.
gaijin
Posty: 42
Rejestracja: 06 czerwca 2012, 08:47

[+] Bash sortowanie według daty z każdej linii

Post autor: gaijin »

Cześć.
Miałem problem. Mam dużo plików w których jest tekst i data. Chciałem posortować w każdym pliku linie według dat malejąco. Daty pomiędzy 1949-2019 rokiem.

wzorzec:

Kod: Zaznacz cały

ala ma kota 2006
olo 1966
znak 1999 jest taki
wynik:

Kod: Zaznacz cały

ala ma kota 2006
znak 1999 jest taki
olo 1966
Daty są w różnych miejscach w linii.

Pomogli koledzy z debian.net:

Kod: Zaznacz cały

#!/bin/bash
sed -e 's/.*\(19[4-9][0-9]\|20[0-1][0-9]\).*/\1/' plik.txt|nl -n ln -s " "|tr -s " "|sed -e "s/\(^[0-9]*\) \(.*\)/\2 \1/"|sort -r|sed -e "s/.* \([0-9]*\)$/\1/"|grep '^[0-9]\+$' > smieci.txt
cat smieci.txt|while read num
do sed -n ${num}p plik.txt;
done
uruchamiam:
./skrypt.sh > przerobiony.txt
Robię to dlatego, iż plik śmieci zawiera tylko pozycję linii, a bez > wyrzuca do konsoli poprawny wynik. Aby go zapisać przekierowuje do przerobiony.txt. Mogło by być ok ale ja mam wiele plików.

Mój skrypt wygląda teraz tak:

Kod: Zaznacz cały

#!/bin/bash
for file in *.txt ; do 
sed -e 's/.*\(19[4-9][0-9]\|20[0-1][0-9]\).*/\1/' $file|nl -n ln -s " "|tr -s " "|sed -e "s/\(^[0-9]*\) \(.*\)/\2 \1/"|sort -r|sed -e "s/.* \([0-9]*\)$/\1/"|grep '^[0-9]\+$' > a/$file
cat a/$file|while read num
do sed -n ${num}p $file;
done;  done
Jak go uruchomię ./skrypt.sh > plik.txt
To oczywiście zapisuje wszystko do jednego pliku. A tak nie chcę.
Ma ktoś pomysł jak przerobić wzorcowy skrypt by zapisywał od razu wszystko do plików?
Ostatnio zmieniony 01 grudnia 2016, 13:00 przez gaijin, łącznie zmieniany 2 razy.
Awatar użytkownika
dedito
Moderator
Posty: 3560
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: Bash sortowanie według daty z każdej linii

Post autor: dedito »

np. tak

Kod: Zaznacz cały

do sed -n ${num}p $file > przerobione/$file
lub tak:

Kod: Zaznacz cały

do sed -n ${num}p $file > ${file}.przerobione
itd. , itp.
gaijin
Posty: 42
Rejestracja: 06 czerwca 2012, 08:47

Re: Bash sortowanie według daty z każdej linii

Post autor: gaijin »

dedito pisze:np. tak

Kod: Zaznacz cały

do sed -n ${num}p $file > przerobione/$file
lub tak:

Kod: Zaznacz cały

do sed -n ${num}p $file > ${file}.przerobione
itd. , itp.
To tak na początku robiłem - generuje dokument z jedna linią z najstarsza datą....
Awatar użytkownika
dedito
Moderator
Posty: 3560
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: Bash sortowanie według daty z każdej linii

Post autor: dedito »

To zmień przekierowanie na dopisywanie >>
gaijin
Posty: 42
Rejestracja: 06 czerwca 2012, 08:47

Re: Bash sortowanie według daty z każdej linii

Post autor: gaijin »

dedito pisze:To zmień przekierowanie na dopisywanie >>

Kod: Zaznacz cały

...
do sed -n ${num}p $file;
done >inny/$file;  done...
to działa
Zablokowany