Je voudrais concaténer un certain nombre de fichiers texte en un seul grand fichier dans le terminal. Je sais que je peux le faire en utilisant la commande cat. Cependant, je voudrais que le nom de fichier de chaque fichier précède le "vidage de données" pour ce fichier. Quelqu'un sait-il comment faire ça?
ce que j'ai actuellement:
file1.txt = bluemoongoodbeer
file2.txt = awesomepossum
file3.txt = hownowbrowncow
cat file1.txt file2.txt file3.txt
Sortie désirée:
file1
bluemoongoodbeer
file2
awesomepossum
file3
hownowbrowncow
Réponses:
Cherchait la même chose, et a trouvé cela pour suggérer:
Production:
S'il n'y a qu'un seul fichier, l'en-tête ne sera pas imprimé. Si vous utilisez des utilitaires GNU, vous pouvez utiliser
-v
pour toujours imprimer un en-tête.la source
-n +1
option! Une alternative:head -n-0 file1 file2 file3
.-n
et+1
, comme dans-n+1
.tail -n +1 *
était exactement ce que je cherchais, merci!sudo ulimit -n 1024; find -f . -name "*.rb" | xargs tail -n+1 > ./source_ruby.txt
J'ai utilisé grep pour quelque chose de similaire:
Il ne vous donne pas un «en-tête», mais préfixe chaque ligne avec le nom de fichier.
la source
*.txt
étendue qu'à un seul fichier. À cet égard, je conseilleraisgrep '' /dev/null *.txt
grep
n'imprimera les en-têtes de fichier que s'il existe plusieurs fichiers. Si vous voulez vous assurer d'imprimer toujours le chemin du fichier, utilisez-H
. Si vous ne voulez pas utiliser les en-têtes-h
. Notez également qu'il sera imprimé(standard input)
pour STDIN.ag
(le chercheur argenté): par défaut,ag . *.txt
préfixe chaque fichier avec son nom, et chaque ligne avec son numéro.-n
à grep donne également des numéros de ligne qui vous permettent d'écrire des linters simples avec un repérage qui pourraient être récupérés par exemple par emacs.Cela devrait aussi faire l'affaire:
Veux dire:
Vous pouvez en outre combiner des recherches à travers des opérateurs booléens comme
-and
ou-or
.find -ls
c'est bien aussi.la source
-print
n'imprimera pas le nom de fichier avant lecat
.-printf
pour personnaliser la sortie. Par exemple:find *.conf -type f -printf '\n==> %p <==\n' -exec cat {} \;
pour faire correspondre la sortie detail -n +1 *
brew install findutils
, puis utilisezgfind
au lieu defind
.find
permet plusieurs-exec
s:find -name '*.conf' -exec printf '\n\e[33;1m%s\e[0m\n' {} \; -exec cat {} \;
Cela devrait faire l'affaire:
ou pour faire ceci pour tous les fichiers texte récursivement:
la source
$0
c'est toute la ligne, donc vous avez en fait des colonnes répétitives là-dedans ...J'avais une série de fichiers qui se terminaient par stats.txt que je voulais concaténer avec les noms de fichiers.
J'ai fait ce qui suit et lorsqu'il y a plus d'un fichier, la commande "more" inclut le nom de fichier comme en-tête.
ou pour un cas général
la source
more <FILES> | cat
Cela affichera le nom de fichier complet (y compris le chemin d'accès), puis le contenu du fichier. Il est également très flexible, car vous pouvez utiliser -name "expr" pour la commande find et exécuter autant de commandes que vous le souhaitez sur les fichiers.
la source
grep
. A utiliser avecbash
:find . -type f -print | grep PATTERN | xargs -n 1 -I {} -i bash -c 'echo ==== {} ====; cat {}; echo'
J'aime cette option
La sortie ressemble à ceci:
la source
Voici comment je gère normalement le formatage comme ça:
Je dirige généralement le chat dans un grep pour des informations spécifiques.
la source
for i in *
n'inclura pas de sous-répertoires.Et la solution awk manquante est:
la source
1
la fin de l'expression?vous pouvez utiliser cette commande simple au lieu d'utiliser une boucle for,
la source
Si vous aimez les couleurs, essayez ceci:
ou:
ou: (avec le package 'multitail' installé)
la source
find . -type f -name "*.txt" | xargs -I {} bash -c "echo $'\e[33;1m'{}$'\e[0m';cat {}"
Si tous les fichiers ont le même nom ou peuvent être mis en correspondance
find
, vous pouvez faire (par exemple):pour trouver, montrer le chemin et cat chaque fichier.
la source
Voici un moyen vraiment simple. Vous avez dit que vous vouliez chatter, ce qui implique que vous souhaitiez afficher l'intégralité du fichier. Mais vous devez également imprimer le nom du fichier.
Essaye ça
head -n99999999 *
ouhead -n99999999 file1.txt file2.txt file3.txt
J'espère que cela pourra aider
la source
head -n -0 file.txt file2.txt file3.txt
. Fonctionne pourhead
dans GNU coreutilsCette méthode imprime le nom de fichier puis le contenu du fichier:
Production:
la source
-f
est utile si vous souhaitez suivre un fichier en cours d'écriture, mais pas vraiment dans le cadre de ce que l'OP a demandé.Si vous voulez remplacer ces vilains ==> <== par autre chose
explication:
tail -n +1 *.txt
- sortie tous les fichiers dans le dossier avec en-têtesed -e 's/==>/\n###/g' -e 's/<==/###/g'
- remplacer==>
par une nouvelle ligne + ### et<==
juste ###>> "files.txt"
- sortie tout dans un fichierla source
la source
Si vous souhaitez que le résultat soit au même format que la sortie souhaitée, vous pouvez essayer:
Résultat:
Vous pouvez mettre
echo -e
avant et après la coupe afin d'avoir également l'espacement entre les lignes:Résultat:
la source
for
boucle parcourt la listels
résultant de la commande.$ ls file{1..3}.txt
Résultat:file1.txt file2.txt file3.txt
chaque itération seraecho
la$file
chaîne puis elle est canalisée dans unecut
commande où j'ai utilisé.
comme séparateur de champ qui divise fileX.txt en deux morceaux et imprime le champ1 (le champ2 est le txt) Le reste doit être clair... jetant un coup d'œil à ceux qui ont déjà mentionné les travaux de tête pour certains d'entre nous:
Mon besoin est de lire la première ligne; comme indiqué, si vous voulez plus de 10 lignes, vous devrez ajouter des options (tête -9999, etc.).
Désolé d'avoir publié un commentaire dérivé; Je n'ai pas suffisamment d'informations sur la rue pour commenter / ajouter au commentaire de quelqu'un.
la source
Pour résoudre ces tâches, j'utilise généralement la commande suivante:
C'est un moyen très pratique de concaténer des fichiers si le nombre de fichiers est assez important.
la source
J'ai d'abord créé chaque fichier: echo 'information'> file1.txt pour chaque fichier [123] .txt.
J'ai ensuite imprimé chaque fichier pour m'assurer que les informations étaient correctes: fichier de queue? .Txt
Ensuite, j'ai fait ceci: fichier de queue? .Txt >> Mainfile.txt. Cela a créé le fichier Mainfile.txt pour stocker les informations de chaque fichier dans un fichier principal.
cat Mainfile.txt a confirmé que tout allait bien.
==> file1.txt <== bluemoongoodbeer
==> file2.txt <== awesomepossum
==> file3.txt <== hownowbrowncow
la source