我正在尝试解决隐藏在awk
问题背后的生物信息学问题。
我有一个制表符分隔的文件,其中第一列是整数(1-25)或字符串(KN #######)。我需要在行的开头添加几个字符,具体取决于它是什么。这是我到目前为止,但没有工作(即 - 没有任何事情发生,并没有错误写入STDOUT,这让我觉得我在某处努力)。
awk '{
if ( $1 ~ /^[0-0]+$/ )
'$1="chr"$1'
else
'$1="chrUn_"$1'
}' someFile
示例:
1 100 100
1 100 100
KN1234 100 100
应该成为
chr1 100 100
chr1 100 100
chrUn_KN1234 100 100
答案 0 :(得分:2)
#!/bin/sh
awk '{
if ( $1 ~ /^[0-9]+$/ ) {
$1 = "chr"$1
} else {
$1 = "chrUn_"$1
}
print
}' bio.txt
答案 1 :(得分:2)
你的正则表达式不正确
$ awk '{pre="UNKNOWN"}
$1~/^[0-9]+$/{pre="chr"}
$1~/^KN/{pre="chrUn_"} {print pre $0}' file
答案 2 :(得分:2)
我会选择这样的事情:
awk '{ print "chr" ($1 ~ /^[0-9]+$/ ? "" : "Un_") $0 }' file
你的尝试引用有问题;你不能在单引号字符串中使用单引号(在这种情况下,你不应该尝试)。
我使用条件运算符打印任一字符串,无需if
/ else
。
使用您的示例输入进行测试:
$ awk '{ print "chr" ($1 ~/^[0-9]+$/ ? "" : "Un_") $0 }' file
chr1 100 100
chr1 100 100
chrUn_KN1234 100 100
此方法保留线的原始结构。在分配给各个字段时要小心,例如将$1
更改为其他内容,因为这将导致awk重新格式化整行,在每个字段之间插入输出字段分隔符OFS
(默认情况下为单个空格)。典型的结果是字段之间的多个空格丢失。
答案 3 :(得分:1)
只需在chr
前加上所有内容,如果有KN
则添加Un_
:
$ awk 'sub(/^/,"chr") && sub(/^chrKN/,"chrUn_KN") || 1' foo
chr1 100 100
chr1 100 100
chrUn_KN1234 100 100