2 votes

Trier un fichier contenant des délimiteurs de lignes.

J'ai un fichier texte qui ressemble à

text_a_3   xxx   yyy
- - - - - - - - - - -
text_b_2   xyx   zyz
- - - - - - - - - - - 
text_b_3   xxy   zyy
- - - - - - - - - - -
text_a_2   foo   bar
- - - - - - - - - - -
text_a_1   foo   bla
- - - - - - - - - - -
text_b_1   bla   bla 

Je veux trier ce fichier numériquement, en fonction du premier champ, de sorte que ma sortie ressemble à:

text_a_1   foo   bla
- - - - - - - - - - -
text_a_2   foo   bar
- - - - - - - - - - -
text_a_3   xxx   yyy
- - - - - - - - - - -
text_b_1   bla   bla 
- - - - - - - - - - -
text_b_2   xyx   zyz
- - - - - - - - - - - 
text_b_3   xxy   zyy

Je pensais que sort ferait l'affaire. J'ai donc essayé

sort -n nom_de_mon_fichier
sort -k1 -n nom_de_mon_fichier

Mais cela donne

- - - - - - - - - - - 
- - - - - - - - - -

1voto

oliv Points 7025

Utilisation uniquement de GNU awk, en faisant appel à la fonction de tri interne asort() et avec le séparateur d'enregistrement défini sur la ligne de tirets :

awk -v RS='- - - - - - - - - - -\n' '
  {a[++c]=$0}
  END{
    asort(a)
    for(i=1;i<=c;i++) 
      printf "%s%s",a[i],(i==c?"":RS)
  }' nom_de_mon_fichier

Le script remplit d'abord le contenu du fichier d'entrée dans le tableau a. Une fois le fichier lu, le tableau est trié puis imprimé avec le même séparateur d'enregistrement d'entrée.

1voto

Walter A Points 129

Lorsque les délimiteurs de ligne se trouvent tous sur les lignes impaires, vous pouvez utiliser

paste -d'\r' - - < votre_fichier | sort -n | tr '\r' '\n'

En fait, je préfère supprimer les délimiteurs à l'avant, trier et les ajouter ensuite, veuillez donc reconsidérer vos exigences:

grep -Ev "(- )*-" votre_fichier | sort -n | sed 's/$/\n- - - - - - - - - - -/'

0voto

RavinderSingh13 Points 29608

Suivre sort + awk pourrait vous aider.

sort -t"_" -k2 -k3 Fichier_input | awk '/^-/ && !val{val=$0} !/^-/{if(prev){print prev ORS val};prev=$0} END{print prev}'

Ajoutons maintenant une forme de solution non compacte.

sort -t"_" -k2 -k3  Fichier_input |
awk '
/^-/ && !val{
  val=$0}
!/^-/{
  if(prev){
    print prev ORS val};
  prev=$0
}
END{
  print prev
}'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X