2014-10-20 23 views
9

File1:Bash l'output del comando incolla formattazione

1 
2 

File2:

1 2 3 
4 5 

File3:

x x x 
yy yy 
zz 

paste file1 file2 file2 mi dà una scheda di uscita separate:

1  1 2 3 x x x 
2  4 5  yy yy 
       zz 

paste -d" " file1 file2 file3 mi dà l'output:

1 1 2 3 x x x 
2 4 5 yy yy 
    zz 

lo voglio come di seguito:

1 1 2 3 x x x 
2 4 5 yy yy 
     zz 

Qualsiasi idea se questo è possibile o dovrei provare qualsiasi altro comando?

+0

Che dire se la seconda linea di '' file2' è 4 5 6 7 8'? Qual è l'output desiderato allora? L'obiettivo qui è avere una colonna per file di input? –

+0

L'obiettivo è utilizzare lo spazio come delimitatore e mantenere comunque la formattazione originale in ogni file. Scusa, non ho ricevuto la tua domanda su file2. – Ramesh

+0

Quindi il problema è stato risolto? Non è chiaro dai tuoi commenti. – fedorqui

risposta

5

potrebbe usare sed dopo per rimuovere le schede

paste file file2 file3 | sed 's/\t/ /' 

1 1 2 3 x x x 
2 4 5 yy yy 
     zz 

Ecco uno script awk uso generale che funziona su qualsiasi numero di file con qualsiasi formattazione.

awk ' 
    {x=ARGIND;a[x]=a[x]>(b=length($0))?a[x]:b} 
    {F[FNR,x]=$0} 
    END{ 
      for(q=1;q<=FNR;q++) 
      { 
        for(i=1;i<=ARGC;i++) 
        { 
        printf("%-"a[i]"s ",F[q,i]) 
        }print "" 
      } 
    }' file{1,2,3,4) 
+0

Cosa succede se i file hanno schede in EOL? – lynxlynxlynx

+0

No, l'utilizzo di delimitatori inutilizzati consente di mantenere impilati orizzontali a forma di scatola. – lynxlynxlynx

+0

@Jidder, Sì, questo è quello che volevo. In effetti, ho provato sed a sostituire le schede con spazi, ma alla fine ho usato un flag "g", che ha incasinato la mia uscita. Sto usando la tua soluzione ora. Grazie. – Ramesh

2

Solo da voi solo esempi, sembra che potreste provare prima a unire i file 1 e 2, quindi aggiungervi quello con il file 3, ma con un delimitatore speciale, che cambierete in seguito in uno spazio.

esempio testato:

paste -d" " file1 file2 | paste -d'|' - file3 | sed 's,|, ,g' 

Qui ho usato |, ma si dovrebbe usare qualcosa che si sa per certo non comparirà nei dati vale a dire qualcosa di ancora più oscuro come ˘. Un po 'un trucco, ma dovrebbe funzionare.

Per soli due file:

paste -d'¤' file1 file2 | sed 's,¤, ,g' 
+0

In realtà, sto generando il comando incolla e assegnandolo a una variabile pastecmd e eseguendolo come $ {pastecmd}, quindi questo metodo non è adatto a me. Ci può essere un numero qualsiasi di file o almeno uno. – Ramesh

+1

Non molto di un ostacolo, basta generare il comando per prendere due file e quindi eseguire il loop su tutti loro. Tutto questo codice e dati possono essere contenuti nella stessa variabile se ne hai davvero bisogno. Ma questa è già una domanda diversa. – lynxlynxlynx

+0

L'ho provato, ma ora ho un altro problema. Quando eseguo il comando generato usando la sintassi $ {pastecmd}, il comando paste pensa che | è un altro file di input.Ho provato a scappare, ma senza fortuna. Preferirei piuttosto esplorare i flag di comando incolla, e vedere questo potrebbe essere ottenibile. Grazie per il tuo tempo. – Ramesh

1

È questo il tipo di attività che stai cercando?

$ more file{1,2,3,4} | cat 
:::::::::::::: 
file1 
:::::::::::::: 
1 
2 
:::::::::::::: 
file2 
:::::::::::::: 
1 2 3 
4 5 6 7 8 
:::::::::::::: 
file3 
:::::::::::::: 
x x x 
yy yy 
zz 
:::::::::::::: 
file4 
:::::::::::::: 
a a a 
bb bb bb 
c c cc 
d d d 
$ paste file{1,2,3,4} | sed -e 's/\t/ \t/g' | column -t -s$'\t' 
1 1 2 3  x x x a a a 
2 4 5 6 7 8 yy yy bb bb bb 
       zz  c c cc 
         d d d 
+0

No, ho bisogno che le schede tra ogni file siano convertite in un unico spazio. Penso di poter ottenere l'output simile al tuo usando semplicemente il comando incolla senza alcun flag. – Ramesh

3

paste rende due volte a me:

$ paste <(paste -d" " f1 f2) f3 
1 1 2 3 x x x 
2 4 5 yy yy 
     zz 
+0

Come funzionerebbe per più file o lunghezze diverse di linee? –

+0

Dovrebbe essere studiato, ma è fuori dalla portata della domanda. È bello che tu l'abbia coperto nella tua risposta, ma non vedo la necessità di generalizzare tutte le risposte: D – fedorqui