Fusionner trois fichiers en un seul fichier maître en excluant l'en-tête des 2e et 3e fichiers


8

J'ai trois fichiers avec n nombre de lignes comme indiqué ci-dessous

sample1.txt

------------------------------
Date        Time    Name    
------------------------------
2013/10/12  12:09:09    Krish
2013/10/12  13:12:01    Ramb
2013/10/12  15:28:39    Likha
2013/10/12  15:56:12    Mat
.
.
.

Sample2.txt

------------------------------
Date        Time    Name    
------------------------------
2013/10/12  11:19:21    Jack
2013/10/12  12:11:09    Rob
2013/10/12  15:45:12    Rick
2013/10/12  22:11:10    Phil
.
.
.

Sample3.txt

------------------------------
Date        Time    Name    
------------------------------
2013/10/12  12:09:09    Eric
2013/10/12  13:12:01    Bob
2013/10/12  15:28:39    Mike
2013/10/12  15:56:12    Nick
.
.
.

J'ai besoin de fusionner ces trois fichiers dans un seul fichier (Master.txt) en excluant les en-têtes (3 premières lignes) dans Sample2.txt et Sample3.txt comme indiqué ci-dessous

Sortie désirée

$cat Master.txt

------------------------------
Date        Time    Name    
------------------------------
2013/10/12  12:09:09    Krish
2013/10/12  13:12:01    Ramb
2013/10/12  15:28:39    Likha
2013/10/12  15:56:12    Mat
2013/10/12  11:19:21    Jack
2013/10/12  12:11:09    Rob
2013/10/12  15:45:12    Rick
2013/10/12  22:11:10    Phil
2013/10/12  12:09:09    Eric
2013/10/12  13:12:01    Bob
2013/10/12  15:28:39    Mike
2013/10/12  15:56:12    Nick

Remarque: sur une machine AIX avec Ksh 88


4
Il est probablement préférable de le faire par programme. Peut-être en utilisant Python et Perl. Si vous faites de telles choses fréquemment, vous pouvez envisager d'utiliser R. R vous permettra d'importer les fichiers individuels en tant que trames de données, puis vous pourrez fusionner les trames de données ensemble. Je pense que les pandas de Python, par exemple, offrent des fonctionnalités similaires, mais je ne les ai pas utilisées.
Faheem Mitha

@FaheemMitha Perl / Python est certainement exagéré pour cela. De plus, Python sur AIX peut être légèrement problématique.
peterph

@peterph Eh bien, peut-être. Mais s'il doit faire de telles manipulations fréquemment, alors l'approche R a beaucoup à recommander. Bien que je n'ai aucune idée de l'état actuel de R sur AIX. Bien que R de presque tous les millésimes devrait pouvoir faire ce genre de manipulations.
Faheem Mitha

1
@FaheemMitha pourquoi diable recommanderiez-vous R pour cela? Tout ce dont l'OP a besoin est de supprimer les 3 lignes les plus hautes de tous les fichiers sauf le premier. Étant donné l'interface UNIX fortement basée sur du texte, cela fonctionne pour les utilitaires standard.
peterph

1
@peterph Eh bien, ce n'est pas nécessaire pour cette manipulation particulière, mais il semble que l'affiche ait besoin de manipuler des tableaux de texte, et en général R est un bon moyen de le faire, et s'adapte probablement mieux aux situations plus complexes. Une approche alternative de l'utilisation des outils Unix est certainement possible. Je ne dis pas que c'est une mauvaise façon de procéder.
Faheem Mitha

Réponses:


18
{ cat sample1.txt; tail -n +4 sample2.txt; tail -n +4 sample3.txt; } > out.txt

@Stephane Chazelas: regrette le commentaire précédent. Merci ça marche parfaitement comme prévu .. !!!
Ram

1
@ram tail -n +4signifie que, quelle que soit la taille du fichier, les 3 premières lignes sont exclues. Je viens de l'essayer avec un fie de 10 lignes. Ne confondez pas le "4" ici avec le fait que votre échantillon a 4 lignes. C'est essentiellement une coïncidence.
Michael Durrant

@ram :) pour être complet, heada une option similaire: -n -Xaffichera toutes les X lignes sauf les dernières .
peterph

2
@peterph, pas sous AIX, pas dans la spécification POSIX (seuls les nombres positifs sont autorisés)
Stéphane Chazelas

Hm, ma mauvaise ... c'est une extension GNU.
peterph

7
sed '4,${/^---/d;/^Date/d;}' sample1.txt sample2.txt sample3.txt > out.txt

2
+1 mais pourriez-vous ajouter un peu d'explication? À quoi sert la ${}syntaxe sed?
terdon

Ce n'est pas le cas ${}, mais "faites {...}sur les lignes 4 pour durer"; il supprime les lignes correspondantes, mais seulement après le premier en-tête. Cependant, l'utilisation de tail est plus générale et plus robuste.
alexis

@terdon comme dit, {}est un regroupement de commandes.
peterph

@alexis dépend de ce que vous voulez au final. L'un des avantages (pas si important de nos jours cependant) est qu'il ne génère qu'un seul processus. De plus, vous pouvez facilement en faire un script en #!/bin/sedétant l'interprète.
peterph
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.