【问题标题】:Add a header to a tab delimited file将标题添加到制表符分隔的文件
【发布时间】:2012-10-05 19:59:03
【问题描述】:

我想在一个制表符分隔的文件中添加一个标题,但我不知道如何在 linux 的一行中做到这一点。

假设我的文件是:

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

现在我想添加一个标题:

name\tage\tuniversity\tcity

我将如何在 linux 的一行中做到这一点?我对 awk、sed、cat 等没问题,但对 perl 一点也不熟悉。

【问题讨论】:

  • 你是在问如何将文本/标题行放在文件的开头?
  • 是的。我看你已经回复了。谢谢。

标签: linux unix sed awk cat


【解决方案1】:

首先创建一个文件头内容:

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

(其中^I 是制表键)

然后将其添加到数据中

$ cat header myfile >newfile
$ mv newfile myfile

【讨论】:

    【解决方案2】:
    $ { 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
    

    【讨论】:

      【解决方案3】:

      没有像“追加”运算符>> 这样的“前置”运算符,但您可以将标题写入临时文件,然后将文件的内容复制到临时文件中,然后将其移回:

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

      【讨论】:

      • 这是一个很好的技术,但如果 cat 要查看其输入,则需要 cat - yourfile。 (也就是说,您必须明确地将 - 作为参数提供给 cat。)
      • @WilliamPursell 你说得对——我错了;谢谢你帮我看!
      【解决方案4】:

      我个人会选择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' |猫-file.txt > file2.txt。即 echo $'${shellvar}\t${shellvar2}\tuniversity\tcity' |猫-file.txt > file2.txt。我试过这样,但根本没有工作。
      • Shell 变量仅在双引号内展开,因此您必须混合引用样式。幸运的是,bash 允许您将不同类型的带引号的字符串彼此直接运行,并且它将相应地加入它们。 "${shellvar}"$'\t'"${shellvar2}"$'\tuniversity\tcity'
      【解决方案5】:
      perl -i -lne 'if($.==1){print "newline\n$_"}else{print}' your_file
      

      【讨论】:

        【解决方案6】:
        cat <(head -1 theFileWithHeader) theFileWithoutHeader > newfile;
        mv newfile theFileWithoutHeader;
        

        【讨论】:

          【解决方案7】:

          习惯awk回答。

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              猜你喜欢
              • 2013-07-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-09-28
              • 2018-10-20
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多