2012-10-15 20 views
7

Chciałbym dodać nagłówek do pliku rozdzielanego tabulatorami, ale nie jestem pewien, jak to zrobić w jednym wierszu w systemie Linux.Dodaj nagłówek do pliku rozdzielanego tabulatorami

Powiedzmy mój plik jest:

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

i teraz chciałbym dodać nagłówek, który mówi:

name\tage\tuniversity\tcity 

Jak miałbym to zrobić w jednej linii w systemie Linux ? Jestem w porządku z awk, sed, cat, itp. Nie zna w ogóle z perl chociaż.

+0

Pytasz jak umieścić linię tekstu/nagłówek na początku pliku? – newfurniturey

+0

tak. Widzę, że już odpowiedziałeś. dzięki. – Dnaiel

Odpowiedz

12

Nie ma „poprzedzić” operator jak „Dołącz” operatora >>, ale można napisać nagłówek do temp pliku, skopiować zawartość pliku jest w temp akt po tym, i przenieść go z powrotem:

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

To jest dobra technika, ale potrzebujesz "cat - yourfile", jeśli kot będzie patrzył na jego dane wejściowe. (Oznacza to, że musisz podać '-' jawnie jako argument dla kota.) –

+0

@WilliamPursell Masz absolutną rację - literówka z mojej strony; dziękuję za złapanie tego dla mnie! – newfurniturey

1

Najpierw utwórz plik o zawartości nagłówka:

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

(gdzie ^I jest kluczem karta)

Następnie poprzedzić go z danymi

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

Albo

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

Osobiście chciałbym wybrać z nano -w file.txt ;-) (np. wystarczy użyć edytora tekstu, nie musi być nano oczywiście)

Ale jeśli chcesz zrobić to w nie-interaktywnym środowisku z jakiegoś powodu, można użyć cat dla wszystkich rodzajów powiązań,:

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

spowoduje dodanie nagłówka do nagłówka i umieszczenie go w postaci file2.txt. Jeśli chcesz zastąpić oryginalny plik można zrobić z

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

Albo można użyć sed następująco:

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

Zauważ, że używam $'...' cytując pozwoli mi korzystać \t do reprezentuje tabulator i \n, aby reprezentować znak nowej linii (pośród innych podstawień, zobacz stronę basha dla więcej). W tego typu cytowanym łańcuchu \\ reprezentuje literalny ukośnik odwrotny. Więc program przechodzi do sed jest rzeczywiście

1 i\ 
name age  university  city 
+0

dodatkowe Q, jak mogę dodać nazwę zmiennej do echo $ 'name \ tage \ tuniversity \ tcity' | cat - plik.txt> plik2.txt. Na przykład echo $ '$ {shellvar} \ t $ {shellvar2} \ tuniversity \ tcity' | cat - plik.txt> plik2.txt. Próbowałem tak i nie działałem w ogóle. – Dnaiel

+2

Zmienne powłoki są rozszerzane tylko w podwójnych cudzysłowach, więc będziesz musiał wymieszać style cytowania. Na szczęście bash pozwala na uruchamianie różnych rodzajów cytowanych ciągów bezpośrednio względem siebie i dołącza do nich odpowiednio. '" $ {shellvar} "$ '\ t'" $ {shellvar2} "$ '\ tuniversity \ tcity'' –

+0

miło, dziękuję bardzo! – 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

Nie zapewnia to odpowiedzi na pytanie. Aby skrytykować lub poprosić o wyjaśnienie od autora, pozostaw komentarz pod swoim postem. - [Z recenzji] (/ opinia/niskiej jakości-posts/17888664) – Sree

Powiązane problemy