2009-11-12 2 views
17

Ci scusiamo per la domanda forse banale.unix join separator char

Ho combattuto un po 'con il comando unix, cercando di ottenere le tabulazioni invece degli spazi bianchi come separatori predefiniti. -t è l'argomento, ma questi non funzionano (Ubuntu 9.10 64 bit 2.6.31-14, GNU coreutils versione 7,4)

join file1 file2 -t"\t" 
join file1 file2 -t="\t" 
join file1 file2 -t="\\t" 
join file1 file2 -t $"\t" 

Et cetera. Certo, posso sempre usare qualche soluzione poco elegante come

join file1 file2 > output 
sed "s/ /\t/g" output 

Ma ho voluto guardare intelligente :-) Inoltre, se c'è un argomento -t, si deve lavorare.

+0

quando l'uso -t, come indicato nella pagina man , dice "Usa il carattere CHAR come separatore dei campi di input e output." quando entrambi i tuoi file hanno lo stesso terminatore, allora funziona. – ghostdog74

risposta

36

Penso che ci vuole una variabile generato on-the-fly

Prova

join file1 file12 -t $'\t' 
+0

. Funziona! –

+0

Fresco. Prima non conoscevo la sintassi '$ '...'' – Boldewyn

+1

$ '\ t' funziona solo in bash e non funziona in POSIX shell (sh) – citrin

2

man join dice che le opzioni devono venire di fronte ai nomi dei file. Hai provato

join -t "\t" file1 file2 

?

Edit: Riflettendo la risposta di Tonio, la linea corretta avrebbe letto

join -t $'\t' file1 file2 
+0

Sì, non funziona. Viene visualizzato l'errore: join: scheda a più caratteri '\\ t ' –

+0

Rimuovere le virgolette? Almeno il messaggio di errore scompare sul mio terminale. – Boldewyn

+0

Sono d'accordo, l'errore scompare, ma l'output è erroneamente vuoto come questo: -/ –

2
join -t "`echo '\t'`" file1 file2 

ps: sulla mia macchina, Red Hat Enterprise Linux Server versione 5.1 (Tikanga), il comando join -t $'\t' file1 file2 restituisce "Nome variabile non valido".

+0

Grazie per l'aggiunta di una soluzione distro specifica –

+0

Che non funziona su Fedora 23, non rilascia nulla. – sebelk

4

È possibile inserire scheda premendo CTRL + V Tab

join -t '<CTRL+v><Tab>' file1 file2 
2

Un trucco alternativo che sembra funzionare è quello di racchiudere l'opzione -t tra virgolette con il carattere di tabulazione letterale. Sembra:

join '-t ' ... 

con uno spazio variabile tra la t e la citazione di chiusura (poiché si tratta di una scheda).

tipizzati, è:

join<Spc>'-t<Ctrl-v><Tab>' ... 
+0

Testato e funziona bene su Fedora 23 – sebelk

0

altro modo è:

join -t "`echo -e "\t"`" file1 file2`

o in un altro bash-moda:

join -t "$(echo -e "\t")" file1 file