Powiedzmy, że mam plik tekstowy taki jak:
john
george
james
stewert
z każdym imieniem w osobnym wierszu.
Chcę przeczytać wiersze tego pliku tekstowego i utworzyć plik tekstowy dla każdej nazwy, jak: john.txt
, george.txt
etc.
Jak mogę to zrobić w Bash?
command-line
bash
levato
źródło
źródło
Odpowiedzi:
# 1 Korzystanie z Bash +
touch
:while read line; [...]; done <in
: Działa,read
dopókiread
nie zwróci się samo1
, co dzieje się, gdy osiągnięty zostanie koniec pliku; dane wejściowe dlaread
odczytywane są z pliku o nazwiein
w bieżącym katalogu roboczym zamiast z terminala z powodu<in
przekierowania;touch "$line.txt"
: Działatouch
na podstawie wartości rozszerzonej$line.txt
, która jest zawartością,line
po której następuje.txt
;touch
utworzy plik, jeśli nie istnieje, i zaktualizuje jego czas dostępu, jeśli istnieje;# 2 Używając
xargs
+touch
:-a in
: powodujexargs
odczyt danych wejściowych z pliku o nazwiein
w bieżącym katalogu roboczym;-I name
: powodujexargs
zastąpienie każdego wystąpienianame
bieżącym wierszem wejściowym w następującym poleceniu;touch name
: Działatouch
na zastąpionej wartościname
; utworzy plik, jeśli nie istnieje, i zaktualizuje jego czas dostępu, jeśli istnieje;źródło
read line
faktycznie przeczyta wiersz? @kos<in
podone
markiread
wwhile
warunku pętli przeczytać i przechowywać jedną linię zein
wline
przy każdej iteracji; w ten sposóbtouch "$line.txt"
wewnątrz pętli zostanie rozwinięty do linii odczytu.txt
na końcu.while read line; do touch "$line.txt"; done <in
sam sobie poradzi? Gdzie jest plik źródłowy?read
działa. Zobaczyćhelp read
.W tym szczególnym przypadku, gdy masz tylko jedno słowo w wierszu, możesz także:
Pamiętaj, że to się zepsuje, jeśli twoje nazwy plików mogą zawierać spacje. W takich przypadkach użyj tego zamiast:
Dla zabawy, oto kilka innych podejść (oba mogą obsługiwać dowolne nazwy plików, w tym wiersze ze spacjami):
Perl
Awk
Należy pamiętać, że w systemie Linux i podobnych systemach rozszerzenie jest opcjonalne dla większości plików. Nie ma powodu, aby dodawać
.txt
rozszerzenie do pliku tekstowego. Możesz to zrobić, ale nie ma to żadnej różnicy. Jeśli więc mimo wszystko chcesz uzyskać rozszerzenie, użyj jednego z:źródło
AWK nadaje się również do tego zadania:
Innym sposobem,
tee
. Zauważ, że to podejście zostanie przerwane, jeśli linia zawiera więcej niż jeden ciąg na liście plików.Alternatywnie
</dev/null tee $(cat filelist)
można to również zrobić, jeśli chcesz uniknąć instalacji rurowejcp /dev/null
podejście (jak pokazałem, działa to z nazwami plików, które zawierają spacje):źródło
echo "" | tee file1 file2 file2
. Ale psuje się, jeśli nazwy plików zawierają spacje.Powiedzmy, że mam odpowiedź ;)
Wodoodporny również ze spacjami i sufiksem =)
źródło