使用Awk编辑数字列值

时间:2015-08-24 17:23:30

标签: bash awk

我想要做的是搜索第一列不以“' rs”开头的行。或者' chr'那么如果这些行以数字开头,则添加' chr'到第一列值的开头,否则保持原样。

我有以下代码:

awk '((!($1 ~ /rs/ || $1 ~ /chr/)) && $1 ~ /^[[:0-9:]]|$/) {$1 = "chr"$1}1' filename > newfilename

这很好,但附上了' chr'对于不以' rs'开头的所有第一列值或者' chr'此列中有一些我不想更改的值,这些值都以字母(a-z)开头。我只想更改以数字(0-9)开头的值。

谢谢!

1 个答案:

答案 0 :(得分:3)

我很确定[[:0-9:]]没有按照您的意愿行事。有关括号表达式的详细信息,您可以man re_format。您可能想要的是[[:digit:]]。但99.9%的时间[0-9]就足够了。

怎么样......

awk '/^(rs|chr)/{print; next} /^[0-9]/{$1="chr" $1} 1' oldfile > newfile

为便于阅读而分手,这就是我们正在做的事情:

# If the line starts with a marker, print it and move to the next line.
/^(rs|chr)/ {
  print;
  next;
}

# If the line starts with a number, convert it.
/^[0-9]/ {
  $1="chr" $1;
}

# If we're still processing, print the line.
1

请注意,当您更改字段内容时,awk会折叠空格。

当然,如果你真的想要" PREPEND"而不是"追加",然后脚本更简单,因为我们可以假设任何以数字开头的行不包含" rs"或者" chr"一开始。

awk '/^[0-9]/ { printf("chr") } 1' oldfile > newfile

另外,你没有说你是否想要现有的" chr"和" rs"要打印或忽略的行。上述解决方案打印出来。要忽略它们,只需使用:

awk '/^(rs|chr)/{ next } /^[0-9]/ { printf("chr") } 1' oldfile > newfile