2010-11-15 7 views
3

J'ai un fichier texte,Comment joindre chaque ligne double?

a1 
a2 
b1 
b2 
c1 
c2 
... 

Je veux rejoindre par deux lignes, donc on peut sort il:

a1:a2 
b1:b2 
c1:c2 
... 

J'utilise bash. la fonction read va manger l'espace de tête, ce qui est indésirable. Et je déteste écrire de simples programmes C stupides.

Ensuite, je peux utiliser tr : "\n" pour diviser le fichier joint en deux fichiers.

+0

« I déteste écrire un simple programme C stupide "- facile. Apprendre un langage de script C'est ce qu'ils sont là pour ça. –

Répondre

12

paste -s -d ':\n' file devrait le faire.

Par exemple:

% cat f 
a1 
a2 
b1 
b2 
% paste -s -d ':\n' f 
a1:a2 
b1:b2 
+0

+1, c'est propre. – codaddict

3
sed 'N;s/\n/:/;' <srcfile> destfile 
+0

Pas besoin de redirection d'entrée, 'sed' accepte un nom de fichier comme argument. Le point-virgule final est inutile. –

0

Vous over there j'ai trouvé un exemple qui peut être transformé en:

sed '$!N;s/\n/:/' < file 
+0

Pas besoin de redirection d'entrée, 'sed' accepte un nom de fichier comme argument. Le '$!' Est redondant. –

0
INDEX=0 
A="" 
B="" 

for i in `awk '{print $1}' input` 
    do 
    if [ $INDEX -eq 0 ]; then 
     A=$i; 
     let INDEX=1; 
    fi 

    if [ $INDEX -eq 1 ]; then 
     B=$i; 
     echo $A:$B 
     let INDEX=0; 
    fi 
done 
+0

Pourquoi ne pas tout écrire en AWK? –

+0

@Dennis Williamson pensait que j'avais lu qu'il le voulait dans BASH, mais oui, si seulement AWK ce serait un morceau de gâteau. –

0
awk '{line=$0; printf line; if (getline) printf ":" $0; print ""}' inputfile 
0

modifier en place avec la sauvegarde:

perl -i.bak -pe 's/\n\Z/:/ if $.%2' file 

modifier en place aucune sauvegarde:

perl -i -pe 's/\n\Z/:/ if $.%2' file 
0

Voici une solution en python:

#!/usr/bin/python3 

def njoin(filename, outfn="", n=3, linesuffix=" "): 
    if not outfn: 
     outfn = filename + ".join" 
    with open(filename) as infh, open(outfn, "w") as outfh: 
     nline = 0 
     for line in infh: 
      if nline % n != n-1: 
       line = line.rstrip() + linesuffix 
      outfh.write(line) 
      nline += 1 

En cas vous pouvez utiliser la fonction comme ceci:

njoin("/path/to/file", n=2, linesuffixe=":") 
Questions connexes