我正在使用awk,因为我认为使用此工具来删除制表符分隔或csv文件的标题要简单得多..
我有两种类型的文件(逗号或制表符分隔),我想要做的就是将标题(NR = 1)修改为:
癌症类型,汇编版本,染色体,染色体 开始,染色体结束
我迄今为止所做的就是列出第一行
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。+
答案 0 :(得分:4)
GNU代码sed
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想要替换原始文件的标题,而不仅仅是将结果打印到控制台。
起初我尝试用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
这样可行,但它为fork
命令使用了1个rm
。最好使用就地编辑。 sed或perl支持此功能。使用perl有点矫枉过正,所以我纠正了一点captha的sed解决方案:
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
魔术..谢谢你们。