Chciałbym połączyć kilka plików tekstowych w jeden duży plik w terminalu. Wiem, że mogę to zrobić za pomocą polecenia cat. Chciałbym jednak, aby nazwa każdego pliku poprzedza „zrzut danych” dla tego pliku. Czy ktoś wie jak to zrobić?
co aktualnie mam:
file1.txt = bluemoongoodbeer
file2.txt = awesomepossum
file3.txt = hownowbrowncow
cat file1.txt file2.txt file3.txt
Pożądane wyjście:
file1
bluemoongoodbeer
file2
awesomepossum
file3
hownowbrowncow
Odpowiedzi:
Szukał tego samego i stwierdził, że to sugeruje:
Wynik:
Jeśli jest tylko jeden plik, nagłówek nie zostanie wydrukowany. Jeśli używasz narzędzi GNU, możesz użyć,
-v
aby zawsze wydrukować nagłówek.źródło
-n +1
opcja! Alternatywą:head -n-0 file1 file2 file3
.-n
i+1
, jak w-n+1
.tail -n +1 *
właśnie tego szukałem, dzięki!sudo ulimit -n 1024; find -f . -name "*.rb" | xargs tail -n+1 > ./source_ruby.txt
Użyłem grep do czegoś podobnego:
Nie daje ci „nagłówka”, ale poprzedza każdą linię nazwą pliku.
źródło
*.txt
rozwinięte tylko do jednego pliku. W związku z tym radziłbymgrep '' /dev/null *.txt
grep
wypisze nagłówki plików tylko wtedy, gdy jest więcej niż jeden plik. Jeśli chcesz zawsze drukować ścieżkę pliku, użyj-H
. Jeśli nie chcesz używać nagłówków-h
. Pamiętaj też, że wydrukuje(standard input)
dla STDIN.ag
(srebrny wyszukiwarka): domyślnieag . *.txt
poprzedza każdy plik swoją nazwą i każdą linię jego numerem.-n
do grep daje również numery linii, które pozwalają pisać proste lintery z dokładnym wskazywaniem, które można wykryć np. Przez emacsa.To powinno załatwić sprawę:
Znaczy:
Ponadto możesz łączyć wyszukiwania za pomocą operatorów logicznych, takich jak
-and
lub-or
.find -ls
też jest miłe.źródło
-print
nie spowoduje wydrukowania nazwy pliku przedcat
.-printf
do dostosowania danych wyjściowych. Na przykład:find *.conf -type f -printf '\n==> %p <==\n' -exec cat {} \;
aby dopasować wyniktail -n +1 *
brew install findutils
a następnie użyjeszgfind
zamiastfind
.find
pozwala na wiele-exec
s:find -name '*.conf' -exec printf '\n\e[33;1m%s\e[0m\n' {} \; -exec cat {} \;
To powinno załatwić sprawę:
lub zrobić to rekurencyjnie dla wszystkich plików tekstowych:
źródło
$0
to jest cała linia, więc faktycznie masz tam powtarzające się kolumny ...Miałem serię plików, które zakończyły się na stats.txt, które chciałem połączyć z nazwami plików.
Wykonałem następujące czynności, a gdy jest więcej niż jeden plik, polecenie „more” zawiera nazwę pliku jako nagłówek.
lub w ogólnym przypadku
źródło
more <FILES> | cat
Spowoduje to wydrukowanie pełnej nazwy pliku (w tym ścieżki), a następnie zawartości pliku. Jest również bardzo elastyczny, ponieważ można użyć -name „expr” dla polecenia find i uruchamiać dowolną liczbę poleceń na plikach.
źródło
grep
. Do użytku zbash
:find . -type f -print | grep PATTERN | xargs -n 1 -I {} -i bash -c 'echo ==== {} ====; cat {}; echo'
Podoba mi się ta opcja
Dane wyjściowe wyglądają tak:
źródło
Oto jak zwykle radzę sobie z takim formatowaniem:
Generalnie podrzucam kota do grepa, żeby uzyskać określone informacje.
źródło
for i in *
nie będzie zawierać podkatalogów.Brakującym rozwiązaniem awk jest:
źródło
1
na końcu wyrażenia?możesz użyć tej prostej komendy zamiast pętli for,
źródło
Jeśli lubisz kolory, spróbuj tego:
lub:
lub: (z zainstalowanym pakietem „multitail”)
źródło
find . -type f -name "*.txt" | xargs -I {} bash -c "echo $'\e[33;1m'{}$'\e[0m';cat {}"
Jeśli wszystkie pliki mają tę samą nazwę lub można je dopasować
find
, możesz (np.):znaleźć, pokazać ścieżkę i cat każdego pliku.
źródło
Oto naprawdę prosty sposób. Powiedziałeś, że chcesz cat, co oznacza, że chcesz wyświetlić cały plik. Ale musisz także wydrukować nazwę pliku.
Spróbuj tego
head -n99999999 *
lubhead -n99999999 file1.txt file2.txt file3.txt
Mam nadzieję, że to pomaga
źródło
head -n -0 file.txt file2.txt file3.txt
. Działahead
wTa metoda wydrukuje nazwę pliku, a następnie zawartość pliku:
Wynik:
źródło
-f
to przydatne, jeśli chcesz śledzić plik, w którym jest zapisywany, ale tak naprawdę nie mieści się w zakresie tego, o co poprosił PO.Jeśli chcesz zastąpić te brzydkie ==> <== czymś innym
wyjaśnienie:
tail -n +1 *.txt
- wypisuje wszystkie pliki w folderze z nagłówkiemsed -e 's/==>/\n###/g' -e 's/<==/###/g'
- wymienić==>
z nowej linii + ### oraz<==
z zaledwie ###>> "files.txt"
- wypisuje wszystko do plikuźródło
źródło
Jeśli chcesz uzyskać wynik w tym samym formacie, co pożądany wynik, możesz spróbować:
Wynik:
Możesz umieścić
echo -e
przed i po cięciu, aby mieć również odstępy między liniami:Wynik:
źródło
for
pętla przechodzi przez listę wynikającą zls
polecenia.$ ls file{1..3}.txt
Rezultat:file1.txt file2.txt file3.txt
każda iteracja będzie ciąg potem to rurami do komendy, gdzie używany jako separator pól, które łamie fileX.txt na dwie części i wypisuje pole1 (pole2 jest txt) Reszta powinna być jasneecho
$file
cut
.
... glomming na tych, którzy już wspominali, że głowa działa dla niektórych z nas:
Potrzebuję przeczytać pierwszą linię; jak wspomniano, jeśli chcesz mieć więcej niż 10 linii, musisz dodać opcje (head -9999 itp.).
Przepraszamy za opublikowanie komentarza pochodnego; Nie mam wystarczających danych ulicznych do komentowania / dodawania do czyichś komentarzy.
źródło
Do rozwiązania tego zadania zwykle używam następującego polecenia:
Jest to bardzo wygodny sposób na łączenie plików, jeśli liczba plików jest dość duża.
źródło
Najpierw utworzyłem każdy plik: echo „informacje”> plik1.txt dla każdego pliku [123] .txt.
Następnie wydrukowałem każdy plik, aby upewnić się, że informacje są prawidłowe: plik ogona? .Txt
Potem zrobiłem to: plik tail? .Txt >> Mainfile.txt. To utworzyło plik Mainfile.txt do przechowywania informacji w każdym pliku w pliku głównym.
cat Mainfile.txt potwierdził, że wszystko jest w porządku.
==> plik1.txt <== bluemoongoodbeer
==> plik2.txt <== awesomepossum
==> plik3.txt <== hownowbrowncow
źródło