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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Witam. Moim celem jest odpowiednie przerobienie pliku tekstowego - chciałbym wyciąć z niego N pierwszych i K ostatnich linijek.
Przykładowo: Mam plik 1-in, który ma 5 linijek, w każdej jakieś dane. Chcę z niego wyprowadzić plik 1-out, który będzie miał ucięte 2 pierwsze i 2 ostatnie linijki. Próbowałem już robić to tworząc plik 1.bufor i porównując go z 1.in:
head -q -n 2 1-in > 1-bufor tail -q -n 2 1-in >> 1-bufor diff 1-filter 1-in > 1-out
Nie do końca o to mi chodzi, ponieważ wydłuża to skrypt, a polecenie head wyrzuca na początku kilka znaków. Ma ktoś prostszą metodę?
Offline
Po pierwsze: http://minio.jogger.pl/2009/11/21/popularne-bledy-p … n-przez-glowe
Rzecz w tym, że liczba linii w pliku może być zmienna, zaś awk nie ma sposobu na określenie, ile wierszy znajduje się w pliku. Masz więc dwie możliwości:
1. dwukrotnie odczytać plik w samym awk (pierwszy raz po to, aby poznać liczbę linii, od której odejmiesz K i tę liczbę przekażesz drugiemu przebiegowi);
2. najpierw odczytać liczbę linii przy pomocy wc a potem tę liczbę (lub liczbę zmniejszoną o K — zależy gdzie chcesz dokonywać operacji arytmetycznych, w powłoce czy w awk) przekazać do awk. Potrzebny Ci tutaj będzie przełącznik -v.
Offline
Minio napisał(-a):
przekazać do awk. Potrzebny Ci tutaj będzie przełącznik -v.
Lub do seda.
Offline
Możesz to zrobić w bardzo prosty sposób (drukuje 2 pierwsze i 2 ostatnie linie pliku):
awk '{if(NR<3)print}{ y=x "\n" $0; x=$0 } END { print y }' staryplik > nowyplik
Offline
Strony: 1