将标头添加到制表符分隔文件

Dna*_*iel 9 unix linux awk sed cat

我想在制表符分隔文件中添加一个标题,但我不知道如何在linux中的一行中添加它.

我们说我的文件是:

roger\t18\tcolumbia\tnew york\n
albert\t21\tdartmouth\tnew london\n
etc...
Run Code Online (Sandbox Code Playgroud)

现在我想添加一个标题:

name\tage\tuniversity\tcity
Run Code Online (Sandbox Code Playgroud)

我怎么能在linux的一行中做到这一点?我很好用awk,sed,cat等等,虽然对perl不熟悉.

new*_*rey 14

没有"prepend"运算符,如"append"运算符>>,但您可以将标题写入临时文件,然后将文件的内容复制到临时文件中,然后将其移回:

echo -e "name\tage\tuniversity\tcity" | cat - yourfile > /tmp/out && mv /tmp/out yourfile
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的技术,但如果cat要查看它的输入,你需要`cat - yourfile`.(也就是说,你必须明确地将`-`作为cat的参数.) (2认同)

Wil*_*ell 8

$ { printf 'name\tage\tuniversity\tcity\n'; cat orig-file; } > new-file
Run Code Online (Sandbox Code Playgroud)

要么

$ printf '1\ni\nname\tage\tuniversity\tcity\n.\nw\n' | ed -s orig-file
Run Code Online (Sandbox Code Playgroud)


Dav*_*d Z 6

就个人而言,我会选择;-) nano -w file.txt(即只使用文本编辑器,当然不必是纳米)

但是,如果您出于某种原因想在非交互式环境中执行此操作,则可以使用cat各种连接:

echo $'name\tage\tuniversity\tcity' | cat - file.txt > file2.txt
Run Code Online (Sandbox Code Playgroud)

将添加标头并将输出放入file2.txt.如果要覆盖原始文件,可以使用

echo $'name\tage\tuniversity\tcity' | cat - file.txt > file2.txt; mv file{2,}.txt
Run Code Online (Sandbox Code Playgroud)

或者您可以使用sed如下:

sed -i $'1 i\\\nname\tage\tuniversity\tcity' file.txt
Run Code Online (Sandbox Code Playgroud)

请注意,我使用$'...'引号来允许我用来\t表示制表符并\n表示换行符(在其他替换中;有关详细信息,请参阅bash手册页).在这种类型的带引号的字符串中,\\表示一个文字反斜杠.所以传递给sed的程序实际上就是

1 i\
name    age     university      city
Run Code Online (Sandbox Code Playgroud)

  • Shell变量只在双引号内扩展,因此您必须混合引用样式.幸运的是,bash允许您直接运行不同类型的引用字符串,并相应地将它们连接起来.` "$ {} shellvar" $ '\ t' "$ {} shellvar2" $"\ tuniversity\tcity'` (2认同)