我在摆弄awk,因为我认为用这个工具来咀嚼标签分隔或csv文件的标题要简单得多。
我有两种类型的文件(逗号或制表符分隔),我要做的就是修改标题(NR =1)以:
癌症类型,组装版本,染色体,染色体起始,染色体末端
到目前为止,我所做的就是列出第一行
awk 'NR == 1‘test2.csv
我真是不知所措。无论如何,在进行一些下游修改之前,我可能会运行这个脚本(sed或awk)。
任何帮助(或指点我一个好的教程/一行)将是非常感谢的。
编辑
嗨,我应该编辑来澄清这一点。我将从一个文件开始,以相同的文件结束,但头被更改。
我可以得到两个版本的文件。
The CSV
癌症类型,组装版本,染色体,染色体起始,染色体末端
后:
cancer_type,assembly_version,染色体,chromosome_start,chromosome_end
和TSV
癌症类型组装版染色体开始染色体末端
后:
cancer_type\t assembly_version\t染色体\t chromosome_start\t chromosome_end
话虽如此,我认为各种方法几乎都奏效了。
编辑2操作系统是os 10.7.+
发布于 2013-07-20 18:05:58
如果您只想修改标题并按原样打印其余的行,那么在GNU awk
中尝试如下所示
awk 'BEGIN{FS=OFS=","}NR==1{$0=tolower($0);gsub(/\y \y/,"_",$0)}1' csv
发布于 2013-07-20 19:55:56
如果我理解得很好,OP想要替换原始文件的头,而不仅仅是将结果打印到控制台。
一开始,我试图用awk来解决这个问题,因为我更了解它。但是awk没有内置的编辑功能,因此需要一些bash解决方案:
# Unsafe hack
#{ rm infile; awk 'NR==1{...}1' >infile;} <infile
#Ed Morton's correction
awk 'NR==1{...}1' infile >tmp && mv tmp infile
这是可行的,但是它为rm
命令使用了一个额外的rm
。最好是使用内部编辑。sed或珀尔支持此特性。使用perl有点过分,所以我修正了卡普塔的sed解决方案:
sed -i '1{s/\b \b/_/g;s/[[:upper:]]/\L&/g;}' 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
发布于 2013-07-20 17:24:40
也许我不完全理解你的问题,但据我所知,这应该能解决这个问题:
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
现在包含完整的结果。
https://stackoverflow.com/questions/17764585
复制相似问题