J'ai une liste de files.txt, ci-dessous:
-rw-rw-r-- 1 root dev 11 May 16 12:18 20_SumActive.txt
-rw-rw-r-- 1 root dev 11 May 16 12:18 22_SumActive.txt
-rw-rw-r-- 1 root dev 7 May 16 12:18 24_SumActive.txt
-rw-rw-r-- 1 root dev 0 May 16 12:18 26_SumActive.txt
-rw-rw-r-- 1 root dev 0 May 16 12:18 28_SumActive.txt
Production:
kpgmeddev01> cat 2[0-8]_SumActive.txt
Sum: 47760
Sum: 72000
Sum: 0
Comment obtenir la sortie comme ci-dessous:
Sum: 47760
Sum: 72000
Sum: 0
[Blank]
[Blank]
Besoin de conseils.
[Blank]
, vouliez-vous dire ces 7 caractères ou aviez-vous l'intention d'indiquer une ligne vide?Réponses:
cat
ne peut pas sortir des données qui n'existent pas dans les fichiers. Si un fichier est vide, il n'a même pas de caractère de nouvelle ligne pour fournir une ligne vide en sortie.Vous pouvez vous assurer que les fichiers contiennent au moins un seul caractère de nouvelle ligne.
Voici comment vous utilisez GNU
awk
pour vous assurer que (cela modifie les fichiers vides):Le
ENDFILE
bloc sera exécuté après avoir fini de lire l'un des fichiers. SiFNR
est zéro, nous n'avons jamais vu de lignes dans le fichier, nous y insérons donc une seule nouvelle ligne. Le script continue ensuite avec le fichier suivant.Vous pouvez ensuite utiliser
cat
comme vous l'avez fait dans la question.Alternativement, sans changer les fichiers, utilisez GNU
awk
au lieu decat
:Cela fait le même type de détection de fichiers vides que ci-dessus, mais imprime la nouvelle ligne sur la sortie standard plutôt que sur le fichier. Le
1
à la fin pourrait être remplacé par{ print }
et entraînera la sortie de toutes les données dans les fichiers non vides.Alternativement, une boucle shell (devrait fonctionner dans n'importe quel shell POSIX):
Le
-s
test sera vrai si le fichier existe et a une taille supérieure à zéro.Si vous souhaitez que la chaîne littérale
[Blank]
soit sortie pour les fichiers vides, insérez simplement cette chaîne devant\n
dans les appels àprintf
ci-dessus (cela fonctionnera également dans leawk
code).la source
Avec
perl
Ce qui ajoute un caractère de nouvelle ligne s'il est manquant à la fin, produirait donc une ligne vide pour les fichiers vides, mais ajouterait également une nouvelle ligne pour les fichiers non vides qui en manquent (et finiraient par être concaténés sur une seule ligne avec
cat
).la source
(Ce n'est pas exactement ce que vous demandez, mais :) Dans ce type de situations, je préfère utiliser
head
Normalement, c'est ce que vous voulez. Sinon, c'est facile à
sed
faire plus tardla source
Avec
xargs
etgrep
vous pouvez essayer quelque chose comme:la source
En supposant que
[Blank]
vous entendiez par là des lignes blanches littérales, cela devrait fonctionner:la source
Vous pouvez tester chaque fichier pour voir s'il est de longueur nulle avant d'essayer d'afficher son contenu:
J'ai utilisé
awk 1 "$f"
au lieu decat "$f"
parce queawk
garantit de terminer la sortie d'un fichier avec une nouvelle ligne.Dans votre question, si vous vouliez que ce
[blank]
ne soit pas un littéral, mais simplement une ligne vierge, vous pouvez l'implémenter en utilisant le code ci-dessus et en le supprimant'[Blank]'
à la fin de l'echo
instruction.la source
Je suppose que vos fichiers 26_SumActive.txt et 28_SumActive.txt sont vides et que vous avez besoin de lignes vides pour afficher leur contenu
Pour cela, vous pouvez simplement parcourir votre liste de fichiers et lire leur contenu, et si le fichier est vide, faites écho à la ligne vierge.
[ -s FILE ]
Vrai si FILE existe et a une taille supérieure à zéro.la source
if [ -s $i ]; then cat $i; else echo -e ""; fi;
. Toujours +1 pour un test simple utilisant uniquement la fonctionnalité shell standard.cat "$i"; test -s "$i" || echo
- pas besoin de ces drapeaux lourdsif
ou non portablesecho
.où - permettra au chat de lire à partir de l'entrée standard.
Ainsi, après avoir affiché le contenu de vos fichiers, cat attendra votre entrée. Vous pouvez faire votre entrée souhaitée, en appuyant sur Entrée pour les blancs littéraux ou [Blanc] si c'est ce que vous voulez. Après chaque entrée, appuyez sur Entrée, une fois toutes les entrées effectuées, appuyez sur ^ D (Ctrl + D) et vous avez terminé.
PS: Pour chaque entrée, vous obtiendrez une sortie respective.
Avec cela, vous pouvez mettre des blancs ou quelque chose d'autre que vous voulez, entre deux séquences de sorties.
la source
cat
une solution et permettre à l'OP de répondre à vos attentes.