2012-10-15 6 views
7

Ich möchte einen Header zu einer Tabulator-getrennte Datei hinzufügen, aber ich bin mir nicht sicher, wie es in einer Zeile in Linux zu tun.Hinzufügen einer Kopfzeile zu einer tabulatorgetrennten Datei

Lassen Sie uns sagen, dass meine Datei ist:

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

und jetzt würde Ich mag einen Header hinzufügen, die sagt:

name\tage\tuniversity\tcity 

Wie würde ich tun, dass in einer Zeile in Linux ? Ich bin ok mit awk, sed, cat, etc. überhaupt nicht vertraut mit Perl.

+0

Sind Sie fragen, wie am Anfang der Datei mit der Textzeile/Header setzen? – newfurniturey

+0

ja. Ich kann sehen, dass du schon geantwortet hast. Vielen Dank. – Dnaiel

Antwort

12

Es gibt keinen "prepend" -Operator wie den "append" -Operator >>, aber Sie können den Header in eine Temp-Datei schreiben, den Inhalt Ihrer Datei danach in die Temp-Datei kopieren und zurück verschieben:

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

Dies ist eine gute Technik, aber Sie brauchen 'cat - yourfile', wenn cat sich die Eingabe ansieht. (Das heißt, Sie müssen "-" explizit als Argument für Katze angeben.) –

+0

@WilliamPursel Sie haben absolut Recht - Tippfehler meinerseits; Danke, dass du das für mich eingefangen hast! – newfurniturey

1

zunächst eine Datei mit dem Header-Inhalt erstellen:

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

(wo ^I ist die Tab-Taste)

dann schreibe an die Daten

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

Oder

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

persönlich würde ich mit nano -w file.txt gehen ;-) (dh nur einen Texteditor verwenden, nicht über nano natürlich sein)

Aber wenn Sie, dies zu tun in einer nicht-interaktiven Umgebung aus irgendeinem Grund wollte, können Sie cat für alle möglichen Verkettungen verwenden:

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

wird die Kopfzeile voranstellen und die Ausgabe in file2.txt setzen. Wenn Sie die ursprüngliche Datei zu überschreiben möchten, können Sie es tun mit

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

Oder könnten Sie sed wie folgt verwenden:

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

Bitte beachte, dass ich verwende $'...' zitierte mir zu erlauben, zu verwenden \t zu Stellen Sie Tab und \n dar, um Newline darzustellen (unter anderen Substitutionen; sehen Sie die bash man Seite für mehr). In diesem Typ von Zeichenfolge in Anführungszeichen steht \\ für einen umgekehrten Schrägstrich. So ging das Programm zu sed ist eigentlich

1 i\ 
name age  university  city 
+0

ein zusätzliches Q, wie würde ich einen Variablennamen in echo $ 'name \ tage \ tunniversity \ tcity' | cat - Datei.txt> Datei2.txt. D. h., Echo $ '$ {shellvar} \ t $ {shellvar2} \ tuniversity \ tcity' | cat - Datei.txt> Datei2.txt. Ich habe es versucht und überhaupt nicht gearbeitet. – Dnaiel

+2

Shell-Variablen werden nur in doppelten Anführungszeichen aufgefächert, daher müssen Sie die Anführungszeichen mischen. Zum Glück können Sie mit bash verschiedene Arten von zitierten Strings direkt aneinanderreihen und es wird ihnen entsprechend beitreten. "$ {shellvar}" $ '\ t' "$ {shellvar2}" $ '\ tuniversity \ tcity'' –

+0

schön, vielen Dank! – 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

Dies liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. - [Aus Bewertung] (/ review/low-quality-posts/17888664) – Sree