Bash awk或sed帮助,用于咀嚼CSV或TSV文件的第一行

Bash awk或sed帮助,用于咀嚼CSV或TSV文件的第一行,bash,sed,awk,perl,Bash,Sed,Awk,Perl,我一直在摆弄awk,因为我认为用这个工具咀嚼以制表符分隔的或csv文件的头要简单得多 我有两种类型的文件(逗号或制表符分隔),我只想将标题(NR=1)修改为: 降低所有单词的大小写 将每个空格替换为下划线 字段名。。例如,将下面的癌症类型更改为*癌症类型* 癌症类型,装配版本,染色体,染色体 开始,结束 到目前为止,我所能做的就是列出第一行 awk'NR==1'test2.csv 嗯,我真是不知所措。在任何情况下,我都可能在做一些下游修改之前运行这个脚本(sed或awk) 任何帮助(或向我指出一

我一直在摆弄awk,因为我认为用这个工具咀嚼以制表符分隔的或csv文件的头要简单得多

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

  • 降低所有单词的大小写
  • 将每个空格替换为下划线 字段名。。例如,将下面的癌症类型更改为*癌症类型*
  • 癌症类型,装配版本,染色体,染色体 开始,结束

    到目前为止,我所能做的就是列出第一行

    awk'NR==1'test2.csv

    嗯,我真是不知所措。在任何情况下,我都可能在做一些下游修改之前运行这个脚本(sed或awk)

    任何帮助(或向我指出一个好的教程/一行)都将不胜感激

    编辑

    嗨,我应该编辑来澄清这一点。 我将采取从一个文件开始,并以相同的文件结束,但与标题改变

    我可以得到两个版本的文件

    CSV

    癌症类型,装配版本,染色体,染色体起始, 染色体末端

    之后:

    癌症类型,装配版本,染色体,染色体起始, 染色体末端

    TSV

    癌症类型\t程序集版本\t染色体\t染色体开始\t 染色体末端

    之后:

    癌症\u类型\t程序集\u版本\t染色体\t染色体\u开始\t 染色体末端

    话虽如此,我认为这些方法几乎奏效了

    编辑2
    操作系统是os X 10.7。+/p>也许我不完全理解你的问题,但据我所知,这应该可以解决它:

    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
    现在包含完整的结果。

    GNU代码


    $echo癌症类型,程序集版本,染色体,染色体开始,染色体结束| sed-r'1{s/*/\L&/;s/\b\s\b/_/g}' 癌症类型,装配版本,染色体,染色体开始,染色体结束
    如果只想修改页眉并按原样打印其余行,请使用
    GNU awk
    尝试类似的操作:

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

    如果我理解的很好,OP希望替换原始文件的头,而不仅仅是将结果打印到控制台

    起初,我试图用我更了解的方法来解决这个问题。但没有就地编辑功能,因此需要一些解决方法:

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

    Cancer Type, Assembly Version, Chromosome, Chromosome start, Chromosome end
    One 1,Two 2
    
    在以下情况下填充:

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

    嘿,伙计们,这两个命令都有效,但对于OSX你必须

    brew install gnu-sed
    
    然后运行sed命令

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

    魔法。。谢谢各位

    嗨。。这似乎可行,但它不会替换csv文件中的标题行吗?另外,对于以制表符分隔的文件而不是csv文件,您需要进行哪些修改?@prussiap请参阅我的答案更新
    sed
    不关心分隔符,它只是解析和替换,也就是说,你可以选择任何你想要的分隔符
    sed
    支持就地编辑。gawk具有就地编辑功能,请查看#6@captcha:谢谢!我不知道
    cmd>infle
    从来都不是个好主意。初始的
    rm
    是完全不必要的,因为
    cmd>foo
    将在启动时截断foo。
    sed
    perl
    的“就地”编辑功能与执行shell重定向相同,因此在实际运行时行为方面没有任何收获。无论它是否有效(并且在一个或两个系统上尝试它,IMHO都不能证明它一般有效!),这段代码比
    awk'…'file>tmp&&mvtmp file
    @EdMorton清楚得多:你完全正确!您的版本不仅更干净,而且更安全!代码更正!我知道
    \s
    不正常。输入字符串可以用
    或制表符分隔。我想
    \s
    也将取代tab。@TrueY-Hmm,目前,单词之间有两个非单词字符。通常,将逗号更改为制表符是一个非消耗性过程。如果发生这种情况(使用字符),则必须更改正则表达式。正则表达式仅适用于给定的问题。然后将其更改为文本空间。只有在即将到来的制表符分隔格式中存在可靠语句的情况下,此时更改正则表达式才有意义。我想,从CSV改为制表符分隔不会删除一些字符。我想差不多了。虽然它应该在填充上起作用。我想使用infle的原因之一是,这些文件可能会比10gb大。。
    cancer_type, assembly_version, chromosome, chromosome_start, chromosome_end
    One 1,Two 2
    
    brew install gnu-sed
    
    gsed -i '1{s/\b \b/_/g;s/[[:upper:]]/\L&/g;}' infile