我想要做的是搜索第一列不以“' rs”开头的行。或者' chr'那么如果这些行以数字开头,则添加' chr'到第一列值的开头,否则保持原样。
我有以下代码:
awk '((!($1 ~ /rs/ || $1 ~ /chr/)) && $1 ~ /^[[:0-9:]]|$/) {$1 = "chr"$1}1' filename > newfilename
这很好,但附上了' chr'对于不以' rs'开头的所有第一列值或者' chr'此列中有一些我不想更改的值,这些值都以字母(a-z)开头。我只想更改以数字(0-9)开头的值。
谢谢!
答案 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