Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2012-10-30 21:04:27

  P@blo - Nadworny matematyk

P@blo
Nadworny matematyk
Skąd: Wrocław v Jasło
Zarejestrowany: 2010-11-11

[bash]zmiana nazw miesięcy na liczbę

Kod:

#!/bin/bash

miesiac() {
    #usage: miesiac $1
    #Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
    case $1 in
        "Jan") echo "1";;
        "Feb") echo "2";;
        "Mar") echo "3";;
        "Apr") echo "4";;
        "May") echo "5";;
        "Jun") echo "6";;
        "Jul") echo "7";;
        "Aug") echo "8";;
        "Sep") echo "9";;
        "Oct") echo "10";;
        "Nov") echo "11";;
        "Dec") echo "12";;
        *) echo "error"
    esac
}

last -R |sed 's/\ \+/#/g' |head -n5 |cut -d'#' -f'3,4,5'|tr '#' ' '| awk '{miesiac($2)}'

Wydaje mi się, że awk najlepiej sobie z tym poradzi, ale nie wiem jak go do tego zmusić. Chodzi o to że 'w drugiej kolumnie' trzeba zmienić na cyferkę.

Z góry dzięki
pozdr

EDIT:Tak na szybko, żeby się zgadzało...

Ostatnio edytowany przez P@blo (2012-11-01 16:03:35)


ThinkPadX220i
| Procesor: Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz |
|  Debian: sid   |   Arch: amd64   |   Sound: alsa   |
| No DE | WM: DWM  |  DM: .bash_profile  |  BIOS+MBR |

Offline

 

#2  2012-10-31 22:11:18

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: [bash]zmiana nazw miesięcy na liczbę

Napisz dokładniej, co chcesz osiągnąć bo stwierdzenie, że "trzeba zmienić na cyferkę" niewiele mi mówi.

Offline

 

#3  2012-11-01 11:31:15

  P@blo - Nadworny matematyk

P@blo
Nadworny matematyk
Skąd: Wrocław v Jasło
Zarejestrowany: 2010-11-11

Re: [bash]zmiana nazw miesięcy na liczbę

@up: A czytałeś tytuł? A znasz troche awk? Myślę, że wystarczająco jest wytłumaczone. Nie twierdze, że jest to prosty problem, ale najwidoczniej to czego chce jest nieosiągalne.

Może zamiast awk ktoś zna inne rozwiązanie?

Albo inaczej. Pytanie: Jak wykorzystać wcześniej zaimplementowaną funkcje (u mnie case) w awk? (ale i tak uważam, że w pierwszym poście kryje się to pytanie...)


ThinkPadX220i
| Procesor: Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz |
|  Debian: sid   |   Arch: amd64   |   Sound: alsa   |
| No DE | WM: DWM  |  DM: .bash_profile  |  BIOS+MBR |

Offline

 

#4  2012-11-01 12:31:23

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/random
Zarejestrowany: 2008-01-07

Re: [bash]zmiana nazw miesięcy na liczbę

A w ogóle wykłada się na funkcji case czy na awk?

Bo u mnie widzę, że case działa dobrze, natomiast całego skrypta nie pokazałeś.

Ostatnio edytowany przez Jacekalex (2012-11-01 12:40:34)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#5  2012-11-01 15:57:45

  P@blo - Nadworny matematyk

P@blo
Nadworny matematyk
Skąd: Wrocław v Jasło
Zarejestrowany: 2010-11-11

Re: [bash]zmiana nazw miesięcy na liczbę

No jasne, że na awk. Case jest napisany dobrze. Edytowałem pierwszego posta, żeby już nikt się nie czepiał. Nie wiem czy w ogóle awk umie takie coś jak 'własna funkcja'. Tzn wiem, że umie, ale nie własna dla awk tylko własna, że moja definiowana przed awk (tak jak w tym skrypcie). No chyba teraz nie ma wątpliwości...

EDIT:
I żeby było jasne. Ten bzdet na koniec:

Kod:

...| awk '{miesiac($2)}'

Nie ma prawa działać. Napisałem go tak bo chciałbym, że awk tak działał... Może ktoś wie jak to poukładać, żeby działało... Jakieś print gdzieś, albo inny znaczek?

Ostatnio edytowany przez P@blo (2012-11-01 16:10:02)


ThinkPadX220i
| Procesor: Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz |
|  Debian: sid   |   Arch: amd64   |   Sound: alsa   |
| No DE | WM: DWM  |  DM: .bash_profile  |  BIOS+MBR |

Offline

 

#6  2012-11-01 17:49:15

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: [bash]zmiana nazw miesięcy na liczbę

Kod:

... | awk '{print "miesiąc " $2}'

?


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#7  2012-11-01 17:51:14

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: [bash]zmiana nazw miesięcy na liczbę

Nie wiem, czy o to ci chodzi, ale wyjaśnię to na przykładzie.
Mam plik z Twojego skryptu o zawartości:

Kod:

        "Jan") echo "1";;
        "Feb") echo "2";;
        "Mar") echo "3";;
        "Apr") echo "4";;
        "May") echo "5";;
        "Jun") echo "6";;
        "Jul") echo "7";;
        "Aug") echo "8";;
        "Sep") echo "9";;
        "Oct") echo "10";;
        "Nov") echo "11";;
        "Dec") echo "12";;

Jeżeli z tego pliku chcesz wydrukować tylko cyfrę odpowiadającą miesiącowi, to robisz tak:

Kod:

$ awk -F '"' '{print $4}' miesiące
1
2
3
4
5
6
7
8
9
10
11
12

Jeżeli chcesz wyciąć nazwę  miesiąca i odpowiadającą mu cyfrę, to robisz tak:

Kod:

$ awk -F '"' '{print $2, $4}' miesiące
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12

Chcesz, aby Twój skrypt po wpisaniu skrótu nazwy miesiąca (Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) drukował odpowiadającą mu cyfrę?

Jeżeli chodzi o uruchamianie poleceń z bash w awk, to możesz to zrobić przez getline lub w system(). W awk również można definiować własne funkcję.

Ostatnio edytowany przez prosze (2012-11-01 19:45:18)

Offline

 

#8  2012-11-01 19:05:19

  P@blo - Nadworny matematyk

P@blo
Nadworny matematyk
Skąd: Wrocław v Jasło
Zarejestrowany: 2010-11-11

Re: [bash]zmiana nazw miesięcy na liczbę

azhag napisał(-a):

Kod:

... | awk '{print "miesiąc " $2}'

?

Ha! To mnie zabiło... :D

Kurcze Panowie. Czytanie ze zrozumieniem się kłania... Tytuł wątku: "zmiana nazw miesięcy na liczbę". Chce aby komenda last zamiast nazw miesięcy (..., Oct, Nov...) wyświetlała liczby (..., 10, 11...). Chce aby skrypt (sugeruje to pierwsza linijka #!/bin/bash) który podałem działał, a nie osobne polecenie w linii komend. U mnie miesiac to funkcja jakby ktoś jeszcze nie zauważył... Bierze nazwę miesiąca i wypluwa mu odpowiednią cyferkę. I tą waśnie funkcje chce wykorzystać w tej linijce last |...| awk "..." tylko nie umiem zmusić awk aby traktował funkcja miesiac jako mu znaną i chciałbym tą funkcję wykorzystać a'la awk miesiac($2). Jaśniej nie potrafię. Jeżeli awk tak nie potrafi to może jest coś inne co drugą kolumnę potraktuje zdefiniowaną funkcją przeze mnie w skrypcie.

Kurcze nie wiem jak to jaśniej napisać... Myślałem, że jest czytelnie i jasno. W końcu w programowaniu im mniej tekstu tym lepiej (przynajmniej tak mi się wydaje)... ;)

Ostatnio edytowany przez P@blo (2012-11-01 19:07:43)


ThinkPadX220i
| Procesor: Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz |
|  Debian: sid   |   Arch: amd64   |   Sound: alsa   |
| No DE | WM: DWM  |  DM: .bash_profile  |  BIOS+MBR |

Offline

 

#9  2012-11-01 19:28:58

  Carnophage - Użytkownik

Carnophage
Użytkownik
Skąd: no route to host…
Zarejestrowany: 2010-05-06
Serwis

Re: [bash]zmiana nazw miesięcy na liczbę

W starsznie zamotany sposob sie do tego zabierasz[1], ale moze to Cie na cos naprowadzi http://www.unix.com/shell-programming-scripting/490 … tion-awk.html

[1] Czemu nie napiszesz po prostu kawalka skrytpu zamiast tworzyc tasiemcowego, nieczytelnego jednolinijkowca?


Happy siduction user ^__^

Offline

 

#10  2012-11-01 19:31:04

  P@blo - Nadworny matematyk

P@blo
Nadworny matematyk
Skąd: Wrocław v Jasło
Zarejestrowany: 2010-11-11

Re: [bash]zmiana nazw miesięcy na liczbę

Lubie jednolinijkowce :) co poradzę... No ale chyba będzie trzeba to rozpisać. Dzięki za sznurek :)

EDIT: Choć case tam chyba nie wsadzę...

Ostatnio edytowany przez P@blo (2012-11-01 19:51:25)


ThinkPadX220i
| Procesor: Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz |
|  Debian: sid   |   Arch: amd64   |   Sound: alsa   |
| No DE | WM: DWM  |  DM: .bash_profile  |  BIOS+MBR |

Offline

 

#11  2012-11-01 20:54:14

  P@blo - Nadworny matematyk

P@blo
Nadworny matematyk
Skąd: Wrocław v Jasło
Zarejestrowany: 2010-11-11

Re: [bash]zmiana nazw miesięcy na liczbę

No dobra. Cały czas jednak stoję w miejscu... Załóżmy, że mam plik:

Kod:

1 Nov a
2 Nov b
1 Oct c
4 Dec d
...

a chce:

Kod:

1 11 a
2 11 b
1 10 c
4 12 d
...

Jak to najłatwiej zrobić w skrypcie bash'a. Wydaje mi się, że ta funkcja case którą napisałem się przyda, ale nie wiem nawet jak za pomocą for'a to zrobić...

Aha no i ten plik jest bardzo długi...

Ostatnio edytowany przez P@blo (2012-11-01 20:57:36)


ThinkPadX220i
| Procesor: Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz |
|  Debian: sid   |   Arch: amd64   |   Sound: alsa   |
| No DE | WM: DWM  |  DM: .bash_profile  |  BIOS+MBR |

Offline

 

#12  2012-11-01 21:15:23

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: [bash]zmiana nazw miesięcy na liczbę

Kod:

sed 's/Nov/11/g;s/Oct/10/g;s/Dec/12/g' plik

Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#13  2012-11-01 21:21:33

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: [bash]zmiana nazw miesięcy na liczbę

Kod:

awk '{sub(/Nov/,11); sub(/Oct/,10); sub(/Dec/,12); print}' plik

Offline

 

#14  2012-11-01 21:30:33

  P@blo - Nadworny matematyk

P@blo
Nadworny matematyk
Skąd: Wrocław v Jasło
Zarejestrowany: 2010-11-11

Re: [bash]zmiana nazw miesięcy na liczbę

//Do wywalenia...

Ostatnio edytowany przez P@blo (2012-11-01 21:31:46)


ThinkPadX220i
| Procesor: Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz |
|  Debian: sid   |   Arch: amd64   |   Sound: alsa   |
| No DE | WM: DWM  |  DM: .bash_profile  |  BIOS+MBR |

Offline

 

#15  2012-11-01 22:18:51

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: [bash]zmiana nazw miesięcy na liczbę

Twój cały skrypt można zapisać tak:

Kod:

last -R | awk '{sub(/Jan/,1);sub(/Feb/,2);sub(/Mar/,3);sub(/Apr/,4);sub(/May/,5);sub(/Jun/,6);sub(/Jul/,7);sub(/Aug/,8);sub(/Sep/,9);sub(/Oct/,10);sub(/Nov/,11);sub(/Dec/,12); print}'

Offline

 

#16  2012-11-01 22:20:19

  P@blo - Nadworny matematyk

P@blo
Nadworny matematyk
Skąd: Wrocław v Jasło
Zarejestrowany: 2010-11-11

Re: [bash]zmiana nazw miesięcy na liczbę

Domyśliłem się. :) Dzięki, zawsze to coś ;)


ThinkPadX220i
| Procesor: Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz |
|  Debian: sid   |   Arch: amd64   |   Sound: alsa   |
| No DE | WM: DWM  |  DM: .bash_profile  |  BIOS+MBR |

Offline

 

#17  2012-11-01 22:24:30

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: [bash]zmiana nazw miesięcy na liczbę

Tak się uruchamia polecenia przez getline:

Kod:

awk 'BEGIN{while("last -R" | getline) {sub(/Jan/,1);sub(/Feb/,2);sub(/Mar/,3);sub(/Apr/,4);sub(/May/,5);sub(/Jun/,6);sub(/Jul/,7);sub(/Aug/,8);sub(/Sep/,9);sub(/Oct/,10);sub(/Nov/,11);sub(/Dec/,12); print}}'

Moja rada jest taka. Ucz się awk, bo naprawdę warto :)

Ostatnio edytowany przez prosze (2012-11-01 22:47:22)

Offline

 

#18  2012-11-02 14:29:24

  P@blo - Nadworny matematyk

P@blo
Nadworny matematyk
Skąd: Wrocław v Jasło
Zarejestrowany: 2010-11-11

Re: [bash]zmiana nazw miesięcy na liczbę

Może to już trochę nie na temat, ale i tak spróbuje.

Mam taki plik:

Kod:

pablo tty8 Thu Nov 1 12:51:21 2012 still logged in 
(unknown tty8 Thu Nov 1 12:50:57 2012 - Thu Nov 1 12:51:21 2012 (00:00) 
pablo tty2 Thu Nov 1 12:50:39 2012 still logged in 
pablo tty7 Thu Nov 1 12:49:45 2012 - Thu Nov 1 12:50:56 2012 (00:01) 
(unknown tty7 Thu Nov 1 12:34:32 2012 - Thu Nov 1 12:49:45 2012 (00:15)

Chciałbym aby zamiast dat z godzinami pojawiły się liczby.

Regex który znajdzie date to:

Kod:

[A-Za-z]{3} [A-Za-z]{3} [0-9] ([0-9]{2}:){2}[0-9]{2} [0-9]{4}

Funkcja która zamieni datę tego formatu na liczbę to (dla jednej wybranej daty):

Kod:

pablo@lena:~$ date -d 'Thu Nov 1 12:50:57 2012' +%s
1351770657

Chce jakimś sed, awk zrobić tak aby automatycznie, znalezione daty były argumentem dla funkcji date. Da się?

Szukałem w necie. Nie umiem znaleźć... :(

EDIT:
Nauczyłem się to:

Kod:

pablo@lena:~$ echo "Thu Nov  1 12:50:39 2012.asdf"|awk -F. '{system("date -d\""$1"\"");}'
czw, 1 lis 2012, 12:50:39 CET

Jeszcze tylko znalezienie regex i zapisanie do zmiennej...

Ostatnio edytowany przez P@blo (2012-11-02 15:29:10)


ThinkPadX220i
| Procesor: Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz |
|  Debian: sid   |   Arch: amd64   |   Sound: alsa   |
| No DE | WM: DWM  |  DM: .bash_profile  |  BIOS+MBR |

Offline

 

#19  2012-11-03 16:03:21

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: [bash]zmiana nazw miesięcy na liczbę

Poradziłeś sobie z problemem? Czekasz na gotowca, czy jeszcze myślisz?

Ostatnio edytowany przez prosze (2012-11-03 16:04:32)

Offline

 

#20  2012-11-03 19:54:12

  P@blo - Nadworny matematyk

P@blo
Nadworny matematyk
Skąd: Wrocław v Jasło
Zarejestrowany: 2010-11-11

Re: [bash]zmiana nazw miesięcy na liczbę

No zrobiłem za pomocą for'a. Wyszło nawet krótko, choć takie coś z tym awk to i tak na przyszłość by się przydało (czyli wykorzystanie zewnętrznej funkcji do zmiany znalezionego regex'a). Nie znam na tyle awk, żeby coś wymyślić. Tutaj znalazłem jak do znalezionej liczby dodać inną, ale nie umiem tego przeobrazić na swoje potrzeby, bo jak zrobiłem w awk system(...) to dawał to do nowej linii i nie wychodziło tak jak to sobie wyobrażałem.

Jednym słowem poległem, ale jak ktoś chce i ma czas to może napisać jak to zrobić. Przyda się na pewno na przyszłość :)


ThinkPadX220i
| Procesor: Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz |
|  Debian: sid   |   Arch: amd64   |   Sound: alsa   |
| No DE | WM: DWM  |  DM: .bash_profile  |  BIOS+MBR |

Offline

 

#21  2012-11-04 11:32:56

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: [bash]zmiana nazw miesięcy na liczbę

Zawartość pliku:

Kod:

pablo tty8 Thu Nov 1 12:51:21 2012 still logged in 
(unknown tty8 Thu Nov 1 12:50:57 2012 - Thu Nov 1 12:51:21 2012 (00:00) 
pablo tty2 Thu Nov 1 12:50:39 2012 still logged in 
pablo tty7 Thu Nov 1 12:49:45 2012 - Thu Nov 1 12:50:56 2012 (00:01) 
(unknown tty7 Thu Nov 1 12:34:32 2012 - Thu Nov 1 12:49:45 2012 (00:15)

Polecenie:

Kod:

gawk --posix '{while(match($0,/([[:alpha:]]{3} ){2}[^[:alpha:]]+[0-9]{4}/)){a=substr($0, RSTART, RLENGTH); "date -d \""a"\" +%s" | getline b sub(a, b)} print}' plik

Wynik:

Kod:

$ gawk --posix '{while(match($0,/([[:alpha:]]{3} ){2}[^[:alpha:]]+[0-9]{4}/)){a=substr($0, RSTART, RLENGTH); "date -d \""a"\" +%s" | getline b sub(a, b)} print}' plik
pablo tty8 1351770681 still logged in 
(unknown tty8 1351770657 - 1351770657 (00:00) 
pablo tty2 1351770639 still logged in 
pablo tty7 1351770585 - 1351770656 (00:01) 
(unknown tty7 1351769672 - 1351769672 (00:15)

Offline

 

#22  2012-11-04 11:54:24

  P@blo - Nadworny matematyk

P@blo
Nadworny matematyk
Skąd: Wrocław v Jasło
Zarejestrowany: 2010-11-11

Re: [bash]zmiana nazw miesięcy na liczbę

Dzięki ci! :) Najlepiej się uczy na przykładach, a to jest dobry przykład :D


ThinkPadX220i
| Procesor: Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz |
|  Debian: sid   |   Arch: amd64   |   Sound: alsa   |
| No DE | WM: DWM  |  DM: .bash_profile  |  BIOS+MBR |

Offline

 

#23  2012-11-04 13:41:20

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: [bash]zmiana nazw miesięcy na liczbę

Tutaj jest stary (z 2000 r.), ale dobry podręcznik do nauki awk — > http://www.linux.net.pl/~wkotwica/doc/gawk/gawk_toc.html

Offline

 

#24  2012-11-04 18:28:15

  P@blo - Nadworny matematyk

P@blo
Nadworny matematyk
Skąd: Wrocław v Jasło
Zarejestrowany: 2010-11-11

Re: [bash]zmiana nazw miesięcy na liczbę

Dzięki na pewno skorzystam :)


ThinkPadX220i
| Procesor: Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz |
|  Debian: sid   |   Arch: amd64   |   Sound: alsa   |
| No DE | WM: DWM  |  DM: .bash_profile  |  BIOS+MBR |

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)