1 votes

AWK divise les fichiers selon un modèle et nomme les nouveaux fichiers selon la chaîne de caractères de la première ligne après le modèle.

Considérez ce dossier :

#!/usr/bin/env bash
cat > example_file.txt <<EOL
sdk,jalxa,9325
m,head1,3
ae,wea,2232
ax1,awq,2321
m,head1,32
dgf,12a,8923
m,head1,11
bsda,awq,902
9as,wea,1732
ax1,awq,2321
EOL

Je voudrais le diviser en ligne en commençant par m,head1, . Le résultat serait donc :

fichier_wea.txt :

m,head1,3
ae,wea,2232
ax1,awq,2321

fichier_12a.txt :

m,head1,32
dgf,12a,8923

fichier_awq.txt :

m,head1,11
bsda,awq,902
9as,wea,1732
ax1,awq,2321

Par exemple, les fichiers résultant de la division doivent être nommés après l'entrée de la deuxième colonne (séparée par des virgules) de la première ligne après la division. dans la deuxième colonne (séparée par des virgules) de la première ligne après le modèle de fractionnement. J'ai du mal avec cette partie (comment référencer la ligne suivante dans AWK ?)

3voto

steeldriver Points 118154

Vous pouvez lire la ligne suivante en awk en utilisant getline

Illustration rapide et sale (vous devriez vraiment vérifier sa valeur de retour et agir en conséquence) :

awk -F, '
  /^m,head/ {
    tmp = $0; getline; outfile = "file_" $2 ".txt"; print tmp > outfile
  } 
  outfile != "" {
    print > outfile
  }
' example_file.txt

donner

$ head file_*.txt
==> file_12a.txt <==
m,head1,32
dgf,12a,8923

==> file_awq.txt <==
m,head1,11
bsda,awq,902
9as,wea,1732
ax1,awq,2321

==> file_wea.txt <==
m,head1,3
ae,wea,2232
ax1,awq,2321

Si les noms de fichiers ne sont pas uniques, vous voudrez probablement ajouter ( >> ) plutôt que de le tronquer ( > ).


Si vous voulez gzip les morceaux, alors plutôt que de créer des fichiers de texte brut et ensuite d'exécuter gzip via un system vous pouvez imprimer des données par l'intermédiaire de l'entrée standard pour gzip comme suit - en veillant à ce que vous soyez Fermeture des redirections d'entrée et de sortie

awk -F, '
  /^m,head/ {
    close("gzip >" outfile); 
    tmp = $0; getline; outfile = "file_" $2 ".txt.gz"; print tmp | "gzip >" outfile
  } 
  outfile != "" {
    print | "gzip >" outfile
  } 
  END {
    close("gzip >" outfile)
  }
' example_file.txt

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X