Disons que je dois effectuer ces actions à partir d'un file d'input:
extraire le nième champ d'une ligne commençant par un motif donné ( dans l'exemple: 2ème champ de la ligne commençant par le motif 'nom' )
imprimer le contenu du champ au début de chaque ligne suivante, alors que la ligne ne commence pas avec le motif sélectionné
quand une nouvelle ligne correspondant au motif est trouvée, répétez les étapes 1 et 2
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
-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
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