Eu gostaria de concatenar uma série de arquivos de texto em um arquivo grande no terminal. Eu sei que posso fazer isso usando o comando cat. No entanto, gostaria que o nome do arquivo de cada arquivo preceda o "despejo de dados" desse arquivo. Alguém sabe como fazer isto?
o que eu tenho atualmente:
file1.txt = bluemoongoodbeer
file2.txt = awesomepossum
file3.txt = hownowbrowncow
cat file1.txt file2.txt file3.txt
saída desejada:
file1
bluemoongoodbeer
file2
awesomepossum
file3
hownowbrowncow
Respostas:
Estava procurando a mesma coisa e encontrou isso para sugerir:
Resultado:
Se houver apenas um arquivo, o cabeçalho não será impresso. Se estiver usando utilitários GNU, você pode
-v
sempre imprimir um cabeçalho.fonte
-n +1
Opção impressionante ! Uma alternativa:head -n-0 file1 file2 file3
.-n
e+1
, como em-n+1
.tail -n +1 *
foi exatamente o que eu estava procurando, obrigado!sudo ulimit -n 1024; find -f . -name "*.rb" | xargs tail -n+1 > ./source_ruby.txt
Eu usei grep para algo semelhante:
Ele não fornece um 'cabeçalho', mas prefixa cada linha com o nome do arquivo.
fonte
*.txt
expandida para apenas um arquivo. A este respeito, eu aconselhogrep '' /dev/null *.txt
grep
imprimirá apenas os cabeçalhos dos arquivos se houver mais de um arquivo. Se quiser imprimir sempre o caminho do arquivo, use-H
. Se você não quiser usar os cabeçalhos-h
. Observe também que ele será impresso(standard input)
para STDIN.ag
(o pesquisador prateado): por padrão,ag . *.txt
prefixa cada arquivo com seu nome e cada linha com seu número.-n
a passagem para grep também gera números de linha que permitem escrever linhas simples com identificações que podem ser captadas por, por exemplo, emacs.Isso deve fazer o truque também:
Significa:
Você também pode combinar pesquisas através de operadores booleanos como
-and
ou-or
.find -ls
é legal também.fonte
-print
, o nome do arquivo não será impresso antes docat
.-printf
para personalizar a saída. Por exemplo:find *.conf -type f -printf '\n==> %p <==\n' -exec cat {} \;
para corresponder à saída detail -n +1 *
brew install findutils
e use emgfind
vez defind
.find
permite que vários-exec
s:find -name '*.conf' -exec printf '\n\e[33;1m%s\e[0m\n' {} \; -exec cat {} \;
Isso deve fazer o truque:
ou faça isso para todos os arquivos de texto recursivamente:
fonte
$0
é toda a linha, então você realmente tem repetindo colunas lá ...Eu tinha uma série de arquivos que terminavam em stats.txt que eu queria concatenar com os nomes dos arquivos.
Fiz o seguinte e, quando houver mais de um arquivo, o comando "more" inclui o nome do arquivo como cabeçalho.
ou para um caso geral
fonte
more <FILES> | cat
Isso imprimirá o nome do arquivo completo (incluindo o caminho) e o conteúdo do arquivo. Também é muito flexível, pois você pode usar -name "expr" para o comando find e executar quantos comandos quiser nos arquivos.
fonte
grep
. Para usar combash
:find . -type f -print | grep PATTERN | xargs -n 1 -I {} -i bash -c 'echo ==== {} ====; cat {}; echo'
Eu gosto dessa opção
A saída é assim:
fonte
É assim que eu costumo lidar com formatação assim:
Eu geralmente canalizo o gato para um grep para obter informações específicas.
fonte
for i in *
não incluirá subdiretórios.E a solução awk ausente é:
fonte
1
no final da expressão?você pode usar esse comando simples em vez de usar um loop for,
fonte
Se você gosta de cores, tente o seguinte:
ou:
ou: (com o pacote 'multitail' instalado)
fonte
find . -type f -name "*.txt" | xargs -I {} bash -c "echo $'\e[33;1m'{}$'\e[0m';cat {}"
Se todos os arquivos tiverem o mesmo nome ou puderem corresponder
find
, você pode fazer (por exemplo):para encontrar, mostre o caminho e crie um arquivo para cada arquivo.
fonte
Aqui está uma maneira realmente simples. Você disse que quer gato, o que implica que você deseja visualizar o arquivo inteiro. Mas você também precisa do nome do arquivo impresso.
Tente isto
head -n99999999 *
ouhead -n99999999 file1.txt file2.txt file3.txt
espero que ajude
fonte
head -n -0 file.txt file2.txt file3.txt
. Funcionahead
no GNU coreutilsEste método imprimirá o nome do arquivo e, em seguida, o conteúdo do arquivo:
Resultado:
fonte
-f
é útil se você deseja acompanhar um arquivo que está sendo gravado, mas não é realmente dentro do escopo do que o OP perguntou.Se você quiser substituir aqueles feios ==> <== por outra coisa
explicação:
tail -n +1 *.txt
- gera todos os arquivos na pasta com cabeçalhosed -e 's/==>/\n###/g' -e 's/<==/###/g'
- substitua==>
por nova linha + ### e<==
por apenas ###>> "files.txt"
- envia tudo para um arquivofonte
fonte
Se você deseja o resultado no mesmo formato da saída desejada, pode tentar:
Resultado:
Você pode colocar
echo -e
antes e depois do corte para ter o espaçamento entre as linhas também:Resultado:
fonte
for
loop percorre a lista em que ols
comando resultou.$ ls file{1..3}.txt
Resultado:file1.txt file2.txt file3.txt
cada iteração seráecho
a$file
string e depois será canalizado para umcut
comando onde eu usei.
como separador de campo que divide fileX.txt em duas partes e imprime o campo1 (campo2 é o txt) O resto deve ficar claro... olhando para aqueles que já mencionaram a cabeça funciona para alguns de nós:
Minha necessidade é ler a primeira linha; como observado, se você quiser mais de 10 linhas, precisará adicionar opções (cabeçalho -9999, etc.).
Desculpe por postar um comentário derivado; Não tenho credito suficiente para comentar / adicionar ao comentário de alguém.
fonte
Para resolver essas tarefas, geralmente uso o seguinte comando:
É uma maneira muito conveniente de concatenar arquivos se o número de arquivos for bastante grande.
fonte
Primeiro, criei cada arquivo: echo 'information'> file1.txt para cada arquivo [123] .txt.
Depois imprimi cada arquivo para garantir que as informações estavam corretas: arquivo final? .Txt
Então eu fiz isso: tail file? .Txt >> Mainfile.txt. Isso criou o Mainfile.txt para armazenar as informações em cada arquivo em um arquivo principal.
O gato Mainfile.txt confirmou que estava tudo bem.
==> file1.txt <== bluemoongoodbeer
==> file2.txt <== awesomepossum
==> file3.txt <== hownowbrowncow
fonte