awk或sed帮助用于复制CSV或TSV文件的第一行

时间:2013-07-20 17:07:44

标签: bash sed awk

我正在使用awk,因为我认为使用此工具来删除制表符分隔或csv文件的标题要简单得多..

我有两种类型的文件(逗号或制表符分隔),我想要做的就是将标题(NR = 1)修改为:

  1. 降低了所有单词
  2. 的大小写
  3. 为每个空格替换任何带下划线的空格 字段名称。例如将癌症类型改为* cancer_type *
  4.   

    癌症类型,汇编版本,染色体,染色体   开始,染色体结束

    我迄今为止所做的就是列出第一行

      

    awk'NR == 1'test2.csv

    好吧,我很茫然。在任何情况下,我都可能在进行一些下游修改之前运行这个脚本(sed或awk)。

    非常感谢任何帮助(或指向一个好的教程/一个衬垫)。

    修改

    您好我应该编辑以澄清这一点。 我将从一个文件开始,以相同的文件结束,但标题已更改。

    我可以获得该文件的两个版本。

    CSV

      

    癌症类型,汇编版本,染色体,染色体启动,   染色体末端

    后:

      

    cancer_type,assembly_version,chromosome,chromosome_start,   chromosome_end

    TSV

      

    癌症类型\ t装配版\ t染色体\ t染色体开始\ t   染色体末端

    后:

      

    cancer_type \ t assembly_version \ t chromosome \ t chromosome_start \ t   chromosome_end

    话虽如此,我认为方法几乎正常运作..

    编辑2 操作系统是OS X 10.7。+

5 个答案:

答案 0 :(得分:4)

GNU代码

sed -r '1 {s/.*/\L&/;s/\b\s\b/_/g}' infile>outfile

$ echo Cancer Type, Assembly Version, Chromosome, Chromosome start, Chromosome end|sed -r '1 {s/.*/\L&/;s/\b\s\b/_/g}'
cancer_type, assembly_version, chromosome, chromosome_start, chromosome_end

答案 1 :(得分:2)

如果您只想修改标题并按原样打印剩余的行,请尝试使用GNU awk进行类似的操作:

awk 'BEGIN{FS=OFS=","}NR==1{$0=tolower($0);gsub(/\y \y/,"_",$0)}1' csv 

答案 2 :(得分:2)

如果我理解,OP想要替换原始文件的标题,而不仅仅是将结果打印到控制台。

起初我尝试用来解决它,因为我知道它更好。但是没有就地编辑功能,因此需要一些解决方法:

# Unsafe hack
#{ rm infile; awk 'NR==1{...}1' >infile;} <infile
#Ed Morton's correction
awk 'NR==1{...}1' infile >tmp && mv tmp infile

这样可行,但它为fork命令使用了1个rm。最好使用就地编辑。 支持此功能。使用perl有点矫枉过正,所以我纠正了一点captha解决方案:

sed -i '1{s/\b \b/_/g;s/[[:upper:]]/\L&/g;}' infile

之前的infile:

Cancer Type, Assembly Version, Chromosome, Chromosome start, Chromosome end
One 1,Two 2

之后的infile:

cancer_type, assembly_version, chromosome, chromosome_start, chromosome_end
One 1,Two 2

答案 3 :(得分:0)

也许我不完全理解你的问题,但据我所知,这应该解决它:

head -1 test2.csv | sed -e 's/\(.*\)/\L\1/' -e 's/ /_/g' > tmp.txt
tail -n +2 test2.csv >> tmp.txt
  • head选择第一行
  • 第一个sed选项使所有内容都为小写
  • 第二个sed选项将所有空格转换为下划线
  • tail打印从第2行开始的所有内容

tmp.txt现在包含完整的结果。

答案 4 :(得分:0)

嘿伙计这两个命令都有效但是对于OS X你必须

brew install gnu-sed

然后运行你的sed命令

gsed -i '1{s/\b \b/_/g;s/[[:upper:]]/\L&/g;}' infile

魔术..谢谢你们。