3

我在搞乱 awk 因为我认为用这个工具来处理制表符分隔或 csv 文件的标题要简单得多。

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

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

癌症类型、组装版本、染色体、染色体开始、染色体结束

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

awk 'NR == 1' test2.csv

好吧,我不知所措。无论如何,我可能会在进行一些下游修改之前运行这个脚本(sed 或 awk)。

任何帮助(或指向我一个好的教程/一个衬垫)将不胜感激。

编辑

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

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

CSV

癌症类型、组装版本、染色体、染色体开始、染色体结束

后:

癌症类型、装配版本、染色体、染色体开始、染色体结束

TSV

癌症类型\t 组装版本\t 染色体\t 染色体开始\t 染色体结束

后:

癌症类型\t 组装版本\t 染色体\t 染色体开始\t 染色体结束

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

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

4

5 回答 5

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}'
癌症类型、装配版本、染色体、染色体开始、染色体结束
于 2013-07-20T17:30:06.620 回答
2

如果您只想修改标题并按原样打印剩余的行,请尝试使用以下命令GNU awk

awk 'BEGIN{FS=OFS=","}NR==1{$0=tolower($0);gsub(/\y \y/,"_",$0)}1' csv 
于 2013-07-20T18:05:58.460 回答
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

这有效,但它使用 1 额外forkrm命令。最好使用就地编辑。支持此功能。使用 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
于 2013-07-20T19:55:56.237 回答
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现在包含完整的结果。

于 2013-07-20T17:24:40.003 回答
0

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

brew install gnu-sed

然后运行你的 sed 命令

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

魔术..谢谢大家。

于 2013-07-22T18:06:37.920 回答