在一个制表符分隔的文件中添加标题

15

我想在一个以制表符分隔的文件中添加头部,但是我不确定如何在linux中用一行命令实现。

假设我的文件如下:

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

现在我想添加一个标题,说:

name\tage\tuniversity\tcity

我怎样才能在Linux中用一行命令实现这个功能?我熟悉awk、sed、cat等命令,但不熟悉perl。


你是在问如何将文本/标题行放在文件开头吗? - newfurniturey
是的。我可以看到你已经回复了。谢谢。 - Dnaiel
8个回答

20

没有像“append”运算符>>一样的“prepend”运算符,但是您可以将标题写入临时文件,然后将文件内容复制到临时文件中,并将其移回:

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

2
这是一种不错的技巧,但如果cat要查看其输入,则需要cat - yourfile(也就是说,您必须将“-”明确地作为cat的参数)。 - William Pursell
@WilliamPursell 你说得完全正确 - 这是我的笔误,感谢你替我发现了它! - newfurniturey

9
$ { 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

6

个人而言,我会选择使用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

另外一个问题是,我该如何将变量名添加到echo $'name\tage\tuniversity\tcity' | cat - file.txt > file2.txt中。例如,echo $'${shellvar}\t${shellvar2}\tuniversity\tcity' | cat - file.txt > file2.txt。我尝试了这样做,但完全不起作用。 - Dnaiel
2
Shell变量仅在双引号内扩展,因此您必须混合引用样式。幸运的是,Bash允许您将不同类型的引用字符串紧密地放在一起,并相应地连接它们。"${shellvar}"$'\t'"${shellvar2}"$'\tuniversity\tcity' - David Z

3
perl -i -lne 'if($.==1){print "newline\n$_"}else{print}' your_file

1

首先创建一个带有头部内容的文件:

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

(其中^I代表制表键)

然后将其添加到数据前面。

$ cat header myfile >newfile
$ mv newfile myfile

1
cat <(head -1 theFileWithHeader) theFileWithoutHeader > newfile;
mv newfile theFileWithoutHeader;

0

传统的 awk 答案。

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

0

使用 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...
$


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接