web-dev-qa-db-fra.com

Ajout de texte variable à un fichier texte par ligne

J'ai un fichier texte:

cat test1
ch140/121_------_T_201607061430
ch140/121_------_T_201611070840
ch140/121_------_T_201611071125
ch140/121_------_T_201611071235

Je veux ajouter à ce fichier ligne par ligne ce texte:

/121_------_T_201607061430
/121_------_T_201611070840
/121_------_T_201611071125
/121_------_T_201611071235

Le résultat doit être:

ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

J'ai utilisé:

cat test1 | sed -e 's/ch140//' > test2
for a in $(cat test2)
do
????
done

Quelle commande puis-je utiliser pour cela?
J'ai essayé d'utiliser une commande sed, mais cela n'a pas fonctionné.

6
Oleksii
sed 's/\/121.*/&&/' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

Explication

  • s/old/new/ remplace old par new
  • \/121.* correspond à /121 et à ce qui vient après
  • && le motif correspondant deux fois

Vous pouvez ajouter tee ou utiliser la redirection pour enregistrer dans un nouveau fichier.

sed 's/\/121.*/&&/' test1 | tee test2
4
Zanna

La commande paste fait ce que cat ne fait que côte à côte. Le -d '' est destiné à paste d'utiliser un séparateur vide, il n'y a donc rien entre les chaînes.

$ paste -d '' test1 test2 
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

Si les fichiers ont une longueur inégale, jetez un œil à ceci question pour éviter des résultats inesthétiques.

4
Tulains Córdova

Vous pouvez aussi utiliser awk:

$ awk -F'/' -vOFS="/" '{print $0,$2}' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

Ici, je règle les séparateurs de champs d'entrée (-F"/") et de sortie (-vOFS="/") sur /. Cela signifie que $2 sera tout après le firdt / et jusqu'au prochain /. Puisqu'il n'y a qu'un / par ligne, $2 est le texte que vous souhaitez ajouter. Le script imprimera chaque ligne ($0), puis ajoutera le deuxième champ ($2).

Vous pouvez également utiliser la même approche en Perl:

$ Perl -F"/" -anle 'print "$_/$F[1]"' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

Alternativement, vous pouvez utiliser la même approche que dans @ réponse de Zanna sed de Zanna :

$ Perl -pe 's#/.*#$&$&#' test1 
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235
3
terdon