2010-01-07 9 views
0

Comment combiner deux lignes adjacentes spécifiques dans un grand fichier texte en une seule ligne à l'aide sed? Par exemple, je veux combiner les lignes numérotées 2001891 et 2001892 en une seule ligne, et les réécrire dans le fichier au même endroit (la ligne 2001893 et ​​les suivantes seront décalées)?2 lignes dans un grand fichier texte à l'aide sed

J'ai googlé autour des tutoriels et manuels sur sed mais tous sont trop cryptique pour moi (les '2,3p;N;s/jam.l,21/.,lk;dczA[12]blahblah' veut dire quoi?)

+1

« Certaines personnes, lorsqu'ils sont confrontés à un problème Unix, pensez « Je sais, je vais utiliser sed. » Maintenant, ils ont deux problèmes. » - Le manuel Unix Haters http://simson.net/ref/ugh .pdf –

Répondre

4

Je ne suis pas un gourou sed, mais je pense que vous voulez: (. Essayez sans -i sur un fichier de test avant de l'exécuter sur des données importantes, bien sûr)

sed -i '2001891N;s/\n//' filename 

$ cat a.dat 
1 
2 
3 
4 
$ sed '2N;s/\n//' a.dat 
1 
23 
4 

J'ai essayé le plus simple sed '2001891s/\n//', mais il ne fonctionne pas lorsque le motif est \n. Pour tout autre motif (sed '2001891s/a//' par exemple), cela semble fonctionner. Il est trop tard dans la nuit pour moi de penser à plus, mais je l'espère l'un des gourous sed expliquera ce qui se passe avec ma commande sed plus simple.

+2

Pour expliquer ce qui se passe ici: le '2001891' est le' adresse'; il dit 'sed' de ne fonctionner que sur les lignes qui correspondent à ce modèle. 'N' dit à sed d'ajouter la ligne suivante dans le' pattern space' (c'est-à-dire, le texte sur lequel il travaille actuellement). ';' commence une nouvelle commande, et finalement 's/\ n //' supprime le caractère de retour à la ligne. –

+0

Ouais, j'allais ajouter une explication, mais vous l'avez fait avant moi. Merci! –

+1

Les commandes 's' et' y' de 'sed' ne voient pas le saut de ligne à la fin de l'espace pattern (ou hold) (seulement ceux qui apparaissent avant la fin). –

0
$ awk 'NR==2001891{printf $0;getline;print;next}1' file > temp;mv temp file 

OU

$ awk '{printf (NR==2001891)?$0:$0"\n"}' file > temp;mv temp file 
0

Je suis sûr que vous pouvez faire de la magie simple utilisant cat, redirection de fichiers et commande nl.

+0

Non, vous ne pouvez pas. –

+0

Qu'est-ce qui vous rend si sûr? –

Questions connexes