我想在一个以制表符分隔的文件中添加头部,但是我不确定如何在linux中用一行命令实现。
假设我的文件如下:
roger\t18\tcolumbia\tnew york\n
albert\t21\tdartmouth\tnew london\n
etc...
现在我想添加一个标题,说:
name\tage\tuniversity\tcity
我怎样才能在Linux中用一行命令实现这个功能?我熟悉awk、sed、cat等命令,但不熟悉perl。
我想在一个以制表符分隔的文件中添加头部,但是我不确定如何在linux中用一行命令实现。
假设我的文件如下:
roger\t18\tcolumbia\tnew york\n
albert\t21\tdartmouth\tnew london\n
etc...
现在我想添加一个标题,说:
name\tage\tuniversity\tcity
我怎样才能在Linux中用一行命令实现这个功能?我熟悉awk、sed、cat等命令,但不熟悉perl。
没有像“append”运算符>>
一样的“prepend”运算符,但是您可以将标题写入临时文件,然后将文件内容复制到临时文件中,并将其移回:
echo -e "name\tage\tuniversity\tcity" | cat - yourfile > /tmp/out && mv /tmp/out yourfile
cat - yourfile
(也就是说,您必须将“-”明确地作为cat的参数)。 - William Pursell$ { 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
"${shellvar}"$'\t'"${shellvar2}"$'\tuniversity\tcity'
- David Zperl -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;
传统的 awk
答案。
awk 'BEGIN { print "name\tage\tuniversity\tcity" } { print }' yourfile > /tmp/out && mv /tmp/out yourfile
使用 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...
$