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