Modèles et traitement de files

Disons que je dois effectuer ces actions à partir d'un file d'input:

Je le fais actuellement en utilisant Python, mais il serait préférable d'utiliser quelque chose de léger et rapide à partir de la command line (comme awk, par exemple).

Entrée d'échantillon

name NAME_A inf field_A1 name NAME_B inf field_B1 inf field_B2 

Production attendue:

 name NAME_A NAME_A inf field_A1 name NAME_B NAME_B inf field_B1 NAME_B inf field_B2 

Cela peut être un moyen de le faire. Notez que le format peut varier selon les séparateurs de champs que vous indiquez – ceux que vous pouvez définir avec FS et OFS :

 $ awk -vn=2 '/^name/ {a=$(n); print; next} {print a, $0}' file name NAME_A NAME_A inf field_A1 name NAME_B NAME_B inf field_B1 NAME_B inf field_B2 

Explication

  • -vn=2 définit le numéro du champ à copyr lorsque le motif est trouvé.
  • /^name/ {a=$(n); print; next} /^name/ {a=$(n); print; next} si la ligne commence par le model donné, stockez le champ donné et imprimez la ligne.
  • {print a, $0} sinon, imprimez d'abord la ligne courante avec la valeur stockée.

Vous pouvez généraliser la partie du motif en quelque chose comme:

 awk -vn=2 -v pat="name" '$1==pat {a=$(n); print; next} {print a, $0}' file 
 sed '/^name */{h;s///;x;n;};G;s/\(.*\)\n\(.*\)/\2 \1/' <<\DATA name NAME_A inf field_A1 name NAME_B inf field_B1 inf field_B2 DATA 

SORTIE

 name NAME_A NAME_A inf field_A1 name NAME_B NAME_B inf field_B1 NAME_B inf field_B2 

sed h olds chaque ligne de nom et, ensuite, supprime de la même façon que le model correspondant, puis il échange l'espace et l'espace de motif avant l'printing,

Sur toutes les autres lignes, il est associé à un espace de motif avec une nouvelle ligne intermédiaire. Ensuite, il suffit d'échanger les deux côtés de cette nouvelle ligne et la remplace par un onglet.

Cela pourrait fonctionner:

 awk '{print $0 ~ pat ? $0 : p OFS $0 }$0 ~ pat{ p = $NF }' pat='name' file