2012-10-15 21 views
7

Vorrei aggiungere un'intestazione a un file delimitato da tabulazioni ma non sono sicuro di come farlo in una riga in linux.Aggiungere un'intestazione a un file delimitato da tabulazione

Diciamo mio file è:

roger\t18\tcolumbia\tnew york\n 
albert\t21\tdartmouth\tnew london\n 
etc... 

e ora vorrei aggiungere un'intestazione che dice:

name\tage\tuniversity\tcity 

Come dovrei farlo in una sola riga in linux ? Io sono d'accordo con awk, sed, cat, ecc. Per niente familiare con perl.

+0

Stai chiedendo come mettere la riga di testo/intestazione all'inizio del file? – newfurniturey

+0

sì. Posso vederti già risposto. Grazie. – Dnaiel

risposta

12

Non esiste un operatore "antepone" come l'operatore "append" >>, ma è possibile scrivere l'intestazione in un file temporaneo, copiare il contenuto del file nel file temporaneo e spostarlo di nuovo:

echo -e "name\tage\tuniversity\tcity" | cat - yourfile > /tmp/out && mv /tmp/out yourfile 
+2

Questa è una buona tecnica, ma hai bisogno di 'cat - yourfile' se il gatto sta per guardare il suo input. (Cioè, devi dare '-' esplicitamente come argomento a cat.) –

+0

@WilliamPursell Hai assolutamente ragione - errore di battitura da parte mia; grazie per averlo preso per me! – newfurniturey

1

Innanzitutto creare un file con il contenuto di intestazione:

$ cat >header 
name^Iage^Iuniversity^Icity (return) 
^D 

(dove ^I è il tasto tab)

Poi anteporre ai dati

$ cat header myfile >newfile 
$ mv newfile myfile 
8
$ { printf 'name\tage\tuniversity\tcity\n'; cat orig-file; } > new-file 

O

$ printf '1\ni\nname\tage\tuniversity\tcity\n.\nw\n' | ed -s orig-file 
6

Personalmente vorrei andare con nano -w file.txt ;-) (cioè basta usare un editor di testo, non deve essere nano ovviamente)

Ma se si voleva fare questo in un ambiente non interattivo, per qualche motivo, è possibile utilizzare cat per tutti i tipi di concatenazioni:

echo $'name\tage\tuniversity\tcity' | cat - file.txt > file2.txt 

anteporre l'intestazione e inserire l'output in file2.txt. Se si desidera sovrascrivere il file originale si può fare con

echo $'name\tage\tuniversity\tcity' | cat - file.txt > file2.txt; mv file{2,}.txt 

Oppure si potrebbe usare sed come segue:

sed -i $'1 i\\\nname\tage\tuniversity\tcity' file.txt 

Nota che sto usando $'...' citando a mi permette di utilizzare \t a rappresenta la scheda e \n per rappresentare la nuova riga (tra le altre sostituzioni, vedere la pagina man di bash per ulteriori informazioni). In questo tipo di stringa tra virgolette, \\ rappresenta un letterale backslash. Così il programma passato a sed è in realtà

1 i\ 
name age  university  city 
+0

un ulteriore Q, come aggiungerei un nome di variabile in echo $ 'name \ tage \ tuniversity \ tcity' | cat - file.txt> file2.txt. Ad esempio, echo $ '$ {shellvar} \ t $ {shellvar2} \ tuniversity \ tcity' | cat - file.txt> file2.txt. Ho provato così e non ha funzionato affatto. – Dnaiel

+2

Le variabili di shell vengono espanse solo tra virgolette doppie, quindi dovrai mescolare gli stili di quotatura. Fortunatamente bash ti permette di eseguire diversi tipi di stringhe tra virgolette l'una contro l'altra e si unirà a loro di conseguenza. '" $ {shellvar} "$ '\ t'" $ {shellvar2} "$ '\ tuniversity \ tcity'' –

+0

bello, grazie mille! – Dnaiel

3
perl -i -lne 'if($.==1){print "newline\n$_"}else{print}' your_file 
0
cat <(head -1 theFileWithHeader) theFileWithoutHeader > newfile; 
mv newfile theFileWithoutHeader; 
+0

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post. - [Dalla recensione] (/ recensione/post di bassa qualità/17888664) – Sree

Problemi correlati