タブ区切りファイルにヘッダーを追加したいのですが、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にまったく詳しくないので大丈夫です。
「追加」演算子のような「追加」演算子はありません>>
、ただし、ヘッダーを一時ファイルに書き込み、その後、ファイルの内容を一時ファイルにコピーして、元に戻すことができます。
echo -e "name\tage\tuniversity\tcity" | cat - yourfile > /tmp/out && mv /tmp/out yourfile
$ { 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
個人的には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
Perl -i -lne 'if($.==1){print "newline\n$_"}else{print}' your_file
まず、ヘッダーコンテンツを含むファイルを作成します。
$ cat >header
name^Iage^Iuniversity^Icity (return)
^D
(どこ ^I
はタブキーです)
次に、データの前に追加します
$ cat header myfile >newfile
$ mv newfile myfile
cat <(head -1 theFileWithHeader) theFileWithoutHeader > newfile;
mv newfile theFileWithoutHeader;
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...
$
慣習的なawk
回答。
awk 'BEGIN { print "name\tage\tuniversity\tcity" } { print }' yourfile > /tmp/out && mv /tmp/out yourfile