如果/然后用awk语句

时间:2016-09-19 17:53:55

标签: linux shell awk bioinformatics

我正在尝试解决隐藏在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 

4 个答案:

答案 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