Me gustaría concatenar varios archivos de texto en un archivo grande en la terminal. Sé que puedo hacer esto usando el comando cat. Sin embargo, me gustaría que el nombre de archivo de cada archivo preceda al "volcado de datos" para ese archivo. Alguien sabe cómo hacer esto?
lo que tengo actualmente:
file1.txt = bluemoongoodbeer
file2.txt = awesomepossum
file3.txt = hownowbrowncow
cat file1.txt file2.txt file3.txt
salida deseada:
file1
bluemoongoodbeer
file2
awesomepossum
file3
hownowbrowncow
Respuestas:
Estaba buscando lo mismo, y descubrí que esto sugiere:
Salida:
Si solo hay un archivo, el encabezado no se imprimirá. Si usa utilidades GNU, puede usar
-v
para imprimir siempre un encabezado.fuente
-n +1
opción! Una alternativa:head -n-0 file1 file2 file3
.-n
y+1
, como en-n+1
.tail -n +1 *
fue exactamente lo que estaba buscando, gracias!sudo ulimit -n 1024; find -f . -name "*.rb" | xargs tail -n+1 > ./source_ruby.txt
Usé grep para algo similar:
No le da un 'encabezado', sino que antepone cada línea con el nombre del archivo.
fuente
*.txt
expande a un solo archivo. En este sentido, aconsejaríagrep '' /dev/null *.txt
grep
solo imprimirá encabezados de archivo si hay más de un archivo. Si desea asegurarse de imprimir siempre la ruta del archivo, use-H
. Si no quieres usar los encabezados-h
. También tenga en cuenta que se imprimirá(standard input)
para STDIN.ag
(el buscador plateado): por defecto,ag . *.txt
prefija cada archivo con su nombre y cada línea con su número.-n
a grep también produce números de línea que le permiten escribir linters simples con puntos precisos que podrían ser, por ejemplo, emacs.Esto también debería hacer el truco:
Medio:
Además, puede combinar búsquedas a través de operadores booleanos como
-and
o-or
.find -ls
También es agradable.fuente
-print
no imprimirá el nombre del archivo antes decat
.-printf
para personalizar la salida. Por ejemplo:find *.conf -type f -printf '\n==> %p <==\n' -exec cat {} \;
para que coincida con la salida detail -n +1 *
brew install findutils
y luego lo uses engfind
lugar defind
.find
permite múltiples-exec
s:find -name '*.conf' -exec printf '\n\e[33;1m%s\e[0m\n' {} \; -exec cat {} \;
Esto debería funcionar:
o para hacer esto para todos los archivos de texto de forma recursiva:
fuente
$0
es la línea completa, por lo que en realidad tienes columnas repetidas allí ...Tenía una serie de archivos que terminaban en stats.txt que quería concatenar con los nombres de archivo.
Hice lo siguiente y cuando hay más de un archivo, el comando "más" incluye el nombre del archivo como encabezado.
o para un caso general
fuente
more <FILES> | cat
Esto imprimirá el nombre de archivo completo (incluida la ruta), luego el contenido del archivo. También es muy flexible, ya que puede usar -name "expr" para el comando find y ejecutar tantos comandos como desee en los archivos.
fuente
grep
. Para usar conbash
:find . -type f -print | grep PATTERN | xargs -n 1 -I {} -i bash -c 'echo ==== {} ====; cat {}; echo'
Me gusta esta opcion
La salida se ve así:
fuente
Así es como normalmente manejo el formato así:
Generalmente canalizo al gato en un grep para obtener información específica.
fuente
for i in *
no incluirá subdirectorios.Y la solución awk que falta es:
fuente
1
al final de la expresión?puedes usar este comando simple en lugar de usar un bucle for,
fuente
Si te gustan los colores, prueba esto:
o:
o: (con el paquete 'multitail' instalado)
fuente
find . -type f -name "*.txt" | xargs -I {} bash -c "echo $'\e[33;1m'{}$'\e[0m';cat {}"
Si todos los archivos tienen el mismo nombre o pueden coincidir con ellos
find
, puede hacer (por ejemplo):para buscar, muestre la ruta y el gato de cada archivo.
fuente
Aquí hay una manera realmente simple. Dijiste que quieres atrapar, lo que implica que quieres ver todo el archivo. Pero también necesita imprimir el nombre del archivo.
Prueba esto
head -n99999999 *
ohead -n99999999 file1.txt file2.txt file3.txt
Espero que ayude
fuente
head -n -0 file.txt file2.txt file3.txt
. Funciona parahead
GNU coreutilsEste método imprimirá el nombre del archivo y luego el contenido del archivo:
Salida:
fuente
-f
es útil si desea rastrear un archivo en el que se está escribiendo, pero que no está dentro del alcance de lo que solicitó el OP.Si quieres reemplazar esos feos ==> <== con algo más
explicación:
tail -n +1 *.txt
- salida de todos los archivos en la carpeta con encabezadosed -e 's/==>/\n###/g' -e 's/<==/###/g'
- reemplace==>
con una nueva línea + ### y<==
solo con ###>> "files.txt"
- salida de todo a un archivofuente
fuente
Si desea que el resultado tenga el mismo formato que el resultado deseado, puede probar:
Resultado:
Puede poner
echo -e
antes y después del corte para tener también el espacio entre las líneas:Resultado:
fuente
for
bucle recorre la listals
resultante del comando.$ ls file{1..3}.txt
Resultado:file1.txt file2.txt file3.txt
cada iteración seráecho
la$file
cadena y luego se canalizará a uncut
comando que utilicé.
como un separador de campo que divide el archivo X.txt en dos partes e imprime el campo1 (campo2 es el txt). El resto debe quedar claro... mirando a aquellos que ya han mencionado la cabeza funciona para algunos de nosotros:
Mi necesidad es leer la primera línea; como se señaló, si desea más de 10 líneas, deberá agregar opciones (head -9999, etc.).
Perdón por publicar un comentario derivado; No tengo suficiente crédito en la calle para comentar / agregar al comentario de alguien.
fuente
Para resolver estas tareas, generalmente uso el siguiente comando:
Es una forma muy conveniente de concatenar archivos si el número de archivos es bastante grande.
fuente
Primero creé cada archivo: echo 'information'> file1.txt para cada archivo [123] .txt.
Luego imprimí cada archivo para asegurarme de que la información era correcta: ¿archivo de cola? .Txt
Luego hice esto: archivo de cola? .Txt >> Mainfile.txt. Esto creó Mainfile.txt para almacenar la información en cada archivo en un archivo principal.
cat Mainfile.txt confirmó que estaba bien.
==> file1.txt <== bluemoongoodbeer
==> file2.txt <== awesomepossum
==> file3.txt <== hownowbrowncow
fuente