J'ai un output.txt de l'exécution d'un script shell comme suit:
abc.txt
errorstatus1
Fri Nov 11 02:00:09 2016
def.txt
errorstatus2.txt
Sat Nov 12 03:00:09 2016
Le fichier texte comporte plusieurs entrées ligne par ligne de la même manière. Je souhaite imprimer ces valeurs dans des colonnes: nom de fichier, statut et horodatage comme suit:
Filename Status Timestamp
abc.txt errorstatus1 Fri Nov 11 02:00:09 2016
def.txt errorstatus2 Sat Nov 12 03:00:09 2016
command-line
bash
scripts
text-processing
linux09
la source
la source
abc.txt,errorstatus1,Fri Nov 11 02:00:09 2016
. J'ai modifié votre question pour qu'elle corresponde à ce qu'elle dit avec l'exemple que vous avez fourni. N'hésitez pas à revenir en arrière, mais veuillez noter que vous devez vraiment clarifier ce que vous voulez exactement - valeurs en colonnes ou valeurs séparées par des virgulesRéponses:
Avec
paste
:cela produira le contenu du fichier séparé par des sauts de ligne sous forme de colonnes et trois colonnes séparées par des tabulations par ligne.
Ajout de l'en-tête:
Pour classer la sortie en colonnes, prenez l'aide de
column
:Exemple:
la source
echo Filename,Status,Timestamp; paste -d ',' - - - <file.txt
Vous pouvez utiliser awk:
La sortie pourrait ne pas être aussi jolie:
Vous pouvez utiliser à la
%s\t
place une sortie séparée par des tabulations.NR % 3
est zéro (et faux) pour chaque troisième ligne, donc les autres lignes sont imprimées avec un espace après elles au lieu d'une nouvelle ligne.next
commence juste la prochaine itération.1
quelle à cause de la finale , avec une nouvelle ligne après, car elle ne correspond pas au premier bloc.la source
Il y a aussi
rs
(l' utilitaire hape BSD r e s ):En particulier,
Donc
ou (pour ajouter l'en-tête)
la source
Pour être complet, vous pouvez aussi le faire avec
sed
:1iFilename\tStatus\tTimestamp
insère la ligne d'en-tête avant la ligne 1N;N
lit deux lignes supplémentaires dans le tampon de motif, ce qui donne un total de 3 lignes séparées par une nouvelle ligney/\n/\t/
remplace toutes les nouvelles lignes par des tabulations dans le tampon de motifLes
i
,N
et lesy
commandes sed sont documentées ici .la source
Il est toujours possible de préparer quelque chose pour le traitement de texte avec AWK ou Perl, et bien sûr Python, ce que fournit cette réponse.
En une ligne:
En tant que script multiligne
L'idée de base ici est de donner l'entrée de script via stdin (en utilisant la redirection du shell
<
, bien qu'un tube puisse également être utilisé). Le script utilise des tabulations pour séparer les champs, bien que des espaces puissent également être utilisés pour une sortie plus "affinée".Exemple de sortie à l'aide d'un exemple d'entrée fourni par OP:
la source