web-dev-qa-db-ja.com

ヘッダーをタブ区切りファイルに追加する

タブ区切りファイルにヘッダーを追加したいのですが、Linuxで1行でヘッダーを追加する方法がわかりません。

私のファイルは次のとおりです:

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

そして今私は言うヘッダーを追加したいと思います:

name\tage\tuniversity\tcity

Linuxでそれを1行で行うにはどうすればよいですか?私はawk、sed、catなど、Perlにまったく詳しくないので大丈夫です。

11
Dnaiel

「追加」演算子のような「追加」演算子はありません>>、ただし、ヘッダーを一時ファイルに書き込み、その後、ファイルの内容を一時ファイルにコピーして、元に戻すことができます。

echo -e "name\tage\tuniversity\tcity" | cat - yourfile > /tmp/out && mv /tmp/out yourfile
16
newfurniturey
$ { printf 'name\tage\tuniversity\tcity\n'; cat orig-file; } > new-file

または

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

個人的にはnano -w file.txt ;-)を使用します(つまり、テキストエディターを使用するだけで、nanoである必要はありません)。

しかし、何らかの理由で非インタラクティブ環境でこれを実行したい場合は、あらゆる種類の連結にcatを使用できます。

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

ヘッダーを付加し、出力をfile2.txtに配置します。元のファイルを上書きしたい場合は、

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

または、次のようにsedを使用できます。

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

$'...'クォートを使用して、タブを表すために\tを使用し、改行を表すために\nを使用できることに注意してください(他の置換の中でも特に、bashのマニュアルページを参照してください)。このタイプの引用符付き文字列では、\\はリテラルバックスラッシュを表します。したがって、sedに渡されるプログラムは実際には

1 i\
name    age     university      city
6
David Z
Perl -i -lne 'if($.==1){print "newline\n$_"}else{print}' your_file
3
Vijay

まず、ヘッダーコンテンツを含むファイルを作成します。

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

(どこ ^Iはタブキーです)

次に、データの前に追加します

$ cat header myfile >newfile
$ mv newfile myfile
1
wallyk
cat <(head -1 theFileWithHeader) theFileWithoutHeader > newfile;
mv newfile theFileWithoutHeader;
1
WCC

sedを使用すると一時ファイルは不要

sed -i "s#^#name\tage\tuniversity\tcity#g#"

デモ:


$ cat file1.txt
roger\t18\tcolumbia\tnew york\n
albert\t21\tdartmouth\tnew london\n
etc...
$ sed -i "s#^#name\tage\tuniversity\tcity#g#" file1.txt $ cat file1.txt
name    age     university      cityroger\t18\tcolumbia\tnew york\n
name    age     university      cityalbert\t21\tdartmouth\tnew london\n
name    age     university      cityetc...
$

0
Digvijay S

慣習的なawk回答。

awk 'BEGIN { print "name\tage\tuniversity\tcity" } { print }' yourfile > /tmp/out && mv /tmp/out yourfile
0
Michael Hall