Wejście:
1
hgh
h2b
h4h
2
ok
koko
lkopk
3
uh
ju
nfjvn
4
Oczekiwany wynik:
1
2
3
4
Tak więc muszę mieć tylko 1., 5., 9., 13. wartość pliku w pliku wyjściowym. Jak to zrobić?
text-processing
Velu
źródło
źródło
sed -n '1~4p'
Odpowiedzi:
Korzystanie z AWK:
Zrozumienie, jak to działa, pozostawia się jako ćwiczenie dla czytelnika.
źródło
NR % 4 == 1
byłoby bardziej czytelne IMO.Używając
split
(GNU coreutils):-n
generowaćCHUNKS
pliki wyjściowei
CHUNKS
jakr/K/N
używaj okrągłego rozkładu robin i wysyłaj Kth of N tylko do standardowego wyjścia bez dzielenia linii / rekordówźródło
Z GNU
sed
:Ze standardem
sed
:Z
1
oraz4
w$n
i$i
zmienne:źródło
Dodanie obowiązkowego rozwiązania Perla:
źródło
Wersja Python, dla zabawy:
źródło
enumerate(f)
powinien być w stanie wykonać to zadanie, zużywając mniej pamięcireadlines
(w ten sposób zapisując cały plik do pamięci), możesz użyć,f.readlines()[::4]
aby uzyskać co czwarty wiersz. Więc możesz użyćprint(''.join(f.readlines()[::4]))
.POSIX sed
: ta metoda wykorzystuje posixly sed, dzięki czemu można go uruchamiać wszędzie lub przynajmniej w tych sekwencjach, które szanują posix.Kolejnym jest programowe generowanie kodu sed dla celów skalowalności:
Perl
: wypełniamy tablicę A, aż osiągnie rozmiar 4. Następnie drukujemy jego pierwszy element, a także usuwamy tablicę.źródło
Zadzwoń za pomocą
scriptname filename skip
(4 w twoim przypadku) Działa poprzez wyciągnięcieiter
linii z góry pliku, a następnie wyprowadzenie tylko ostatniego. Następnie zwiększaiter
sięskips
i powtarza, o ile wartośćiter
nie przekroczyła wartościlines
infile
.źródło
Pure Bash:
mapfile jest wbudowanym dodatkiem w Bash 4, który odczytuje standardowe dane wejściowe do tablicy, o tej nazwie
lines
, z jednym wierszem na wpis.-t
Wariant taśmy końcowe nowych linii.Jeśli chcesz drukować co czwarty wiersz, zaczynając od wiersza 4, możesz to zrobić za pomocą jednej komendy, używając
mapfile
opcji wywołania zwrotnego-C
, która uruchamia dostarczony kod co tyle wierszy, z interwałem podanym przez-c
. Bieżący indeks tablicy i następny wiersz do przypisania są podawane do kodu jako argumenty.To używa
printf
wbudowanego; kod formatu%.0s
pomija pierwszy argument (indeks), więc wypisywana jest tylko linia.Możesz użyć tego samego polecenia, aby wydrukować co czwartą linię, zaczynając od linii 1, 2 lub 3, ale musiałbyś
input
przed dodaniem 3, 2 lub 1 linii przed karmieniem jejmapfile
, co moim zdaniem jest bardziej kłopotliwe niż warte .Działa to również:
Tutaj
printf
zużywa cztery wpisy tablicylines
jednocześnie, tylko drukując pierwszy i pomijając pozostałe trzy za pomocą%.0s
. Nie podoba mi się to, ponieważ trzeba ręcznie manipulować ciągiem formatu dla różnych interwałów lub punktów początkowych.źródło