Powiedzmy, że mam polecenie, command
które wypisuje na standardowe wyjście ogromną liczbę linii:
line1
line2
.....
lineN
Chcę zapisać dane wyjściowe na dysku, ale nie jako pojedynczy plik, ale jako sekwencję plików, z których każdy ma 1000 wierszy standardowego wyjścia:
file0001.txt:
-------------
line1
....
line1000
file0002.txt:
-------------
line1001
....
line2000
etc
Próbowałem google znaleźć odpowiedź, ale za każdym razem google kieruje mnie do tee
polecenia, co w tej sytuacji jest bezużyteczne. Prawdopodobnie wpisuję nieprawidłowe zapytania.
źródło
split [arguments...] [input e.g. "-" for stdin] [output_prefix]
, na przykład:tar -c somedir | split --byes 100MB --numeric-suffixes --suffix-length=3 - somedir.tar.part-
wypuściłbym wiązkę 100 MB plików o nazwachsomedir.tar.part-000
001, 002 i tak dalej.Możesz użyć skryptu bash
lines.bash
i użyj go jako:
cat long_file.txt | bash lines.bash
Jedyny problem, który zauważyłem, to
*
logowanie sięlong_file.txt
(ktoś mógłby to naprawić).źródło
IFS
pusty ciąg, aby uniknąć podziału słówread
. Służy-r
do wyłączania ucieczki odwrotnego ukośnikaread
. Usuń,-e
aby uniknąć ucieczki odwrotnego ukośnikaecho
. Użyj cudzysłowu, aby uniknąć podziału słówecho
. Używać-v
wbash
od 4,0 do uniknięcia rozpoczęciem procesu cząstkowego. Użyj post-inkrementacji, ponieważ twój obecny kod umieści w pierwszym pliku tylko 999 linii.a=0; while IFS='' read -r line; do printf -v filename "%04d.txt" $((a++/1000)); echo "$line" >> "$filename"; done
printf
nie ma-v
przełącznika. (bash 4.2.10
). Przynajmniej nie ma tego na stronieprintf
man printf
dokumenty / usr / bin / printf, które nigdy nie mogłyby w życiu ustawić zmiennej środowiskowej. Zobaczhelp printf
dokumentacjęprintf
wbudowaną powłoki.++/
części jest jeszcze błąd składniowy .