Mam wiele plików, z którymi chcę się połączyć cat
. Powiedzmy
File1.txt
foo
File2.txt
bar
File3.txt
qux
Chcę konkatować, aby ostateczny plik wyglądał następująco:
foo
bar
qux
Zamiast tego ze zwykłym cat File*.txt > finalfile.txt
foo
bar
qux
Jak to zrobić we właściwy sposób?
Odpowiedzi:
Możesz to zrobić:
Upewnij się, że plik
finalfile.txt
nie istnieje, zanim uruchomisz powyższe polecenie.Jeśli masz prawo do korzystania
awk
, możesz:źródło
AWK '{print $0}' *.txt
awk 'FNR==1 && NR > 1 ...'
zamiast tego.>finalfile.txt
podone
, możesz nadpisać zamiast dołączać, co usunie wymóg upewnienia się, że przed pętlą brakuje pliku lub jest on pusty.Jeśli masz wystarczająco dużo plików, które możesz wyświetlić każdy z nich, możesz użyć podstawiania procesów w Bash, wstawiając nowy wiersz między każdą parą plików:
źródło
Gdybym to robił, użyłbym seda:
W tym wzorcu sed $ ma dwa znaczenia, po pierwsze dopasowuje tylko numer ostatniej linii (jako zakres linii do zastosowania wzorca), a po drugie dopasowuje koniec linii we wzorcu podstawiania.
Jeśli twoja wersja seda nie ma
-s
(przetwarzaj pliki wejściowe osobno), możesz to wszystko zrobić w pętli:źródło
sed -s '$G' *.txt > finalfile.txt
find
zamiast*.txt
, co oznaczało, że plik został dołączony do siebie!Możesz to zrobić używając,
xargs
jeśli chcesz, ale główna idea jest taka sama:źródło
xargs
dużo łatwiejszy w użyciu niż pętle w bashu.Działa to w Bash:
W przeciwieństwie do odpowiedzi z
>>
(dołącz), dane wyjściowe tego polecenia mogą być przesłane potokiem do innych programów.Przykłady:
for f in File*.txt; do cat $f; echo; done > finalfile.txt
(for ... done) > finalfile.txt
(pareny są opcjonalne)for ... done | less
(rury w mniej)for ... done | head -n -1
(to usuwa końcową pustą linię)źródło
Tak właśnie zrobiłem to na OsX 10.10.3
ponieważ proste polecenie „echo” bez parametrów zakończyło się brakiem wstawienia nowych wierszy.
źródło
W Pythonie łączy się to z pustymi wierszami między plikami (
,
zapobiega dodawaniu dodatkowego końcowego pustego wiersza):Oto brzydka jedna linijka Pythona, którą można wywołać z powłoki i wypisuje dane wyjściowe do pliku:
źródło