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é.
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
s/old/new/
remplace old
par new
\/121.*
correspond à /121
et à ce qui vient après&&
le motif correspondant deux foisVous pouvez ajouter tee
ou utiliser la redirection pour enregistrer dans un nouveau fichier.
sed 's/\/121.*/&&/' test1 | tee test2
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.
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