2014-02-11 33 views
0

有一个文件,我想要在除第一个字段之外的所有字段上执行awk Gsub。有可变数量的领域,所以我想弄清楚,如果我可以写一个条件命令适用于除1美元以外的所有。awk - 适用于除一个之外的所有字段?

如果有办法说$ {2-20},我甚至会工作。但是,我似乎无法在awk的任何地方找到这种类型的命令。谢谢。这是一个可以练习的例子。

我希望做这样的事情:

编辑

我试过,但它并没有改变任何东西。

awk 'x!=$1{gsub("C","g",x);gsub("G","c",x);gsub("T","a",x);gsub("A","t",x)}{print}' F1 

F1 
G 6472 193 0.0 0.0 193.0 0.0 0.0 C d 
T 6482 91 91.0 0.0 0.0 0.0 0.0 T  d 
G 7482 187 0.0 0.0 187.0 0.0 0.0 C d 
T 8860 74 0.0 0.0 0.0 74.0 0.0 A d 
G 9254 52 0.0 0.0 52.0 0.0 0.0 C d 
A 10059 78 78.0 0.0 0.0 0.0 0.0 T  d 
G 10476 757 0.0 1.0 755.0 1.0 0.0 C d 
G 16122 125 0.0 1.0 124.0 0.0 0.0 C d 
G 17053 316 0.0 0.0 316.0 0.0 0.0 C d 
G 19312 56 0.0 0.0 55.0 1.0 0.0 C d 


Desired out 
G 6472 193 0.0 0.0 193.0 0.0 0.0 g d 
T 6482 91 91.0 0.0 0.0 0.0 0.0 a  d 
G 7482 187 0.0 0.0 187.0 0.0 0.0 g d 
T 8860 74 0.0 0.0 0.0 74.0 0.0 t d 
G 9254 52 0.0 0.0 52.0 0.0 0.0 g d 
A 10059 78 78.0 0.0 0.0 0.0 0.0 a  d 
G 10476 757 0.0 1.0 755.0 1.0 0.0 g d 
G 16122 125 0.0 1.0 124.0 0.0 0.0 g d 
G 17053 316 0.0 0.0 316.0 0.0 0.0 g d 
G 19312 56 0.0 0.0 55.0 1.0 0.0 g d 

谢谢。

+1

看起来只有$(NF-1)在您所需的输出中发生了变化。那是对的吗?总是很好地包含你当前使用的代码。 AND ...不要忘记'for(i = 2; i shellter

+0

这工作。你应该把它作为答案,以便我可以投票。有一件事会让它变得更好(而我遇到的另一个问题是awk)有没有办法在$ 8之后维持空格? Awk只是看到了白色空间,并不会将“”定义为字段。 – jeffpkamp

回答

2

的另一种方式,去......把你的代码:

awk '{ s=$1; sub($1,""); gsub("C","g"); gsub("G","c"); gsub("T","a"); gsub("A","t"); print s $0 }' filename 

要保留我以前sub($1,"")代替$1=""的空格。

+0

很简单,它的工作。我试图弄清楚如何使用sub($ 1,“”)保留这个空白区域......你能解释一下吗(比如为什么它不只是让$ 1 =“” – jeffpkamp

+0

因为awk重新计算整个记录时,分配字段('$ 1 =“something”,$ 2 =“...”,'etc),删除进程中的任何额外的空白字符,而在整个记录替换子字符的情况下($ 1,“”)' ,(等于'sub($ 1,“”,$ 0)'),没有字段重新分配发生,所以空格被保留。 – lind

2

这一行你想要做什么:

awk 'BEGIN{d["C"]="g";d["G"]=c;d["T"]="a";d["A"]="t"} 
     $(NF-1) in d{$(NF-1)=d[$(NF-1)]}7' file 
+0

这很好。我也喜欢它允许我用另一个资本替换一个首都,而不必担心随后的规则将它写下来,就像我使用gsub脚本一样。即我可以做d [“G”] =“C”。非常好。 – jeffpkamp

0

只是为了翻译文字,或许矫枉过正这个特殊的例子另一种选择:

$ cat tst.awk 
function tr(old,new,str,  oldA,newA,i) { 
    split(old,oldA,"") 
    split(new,newA,"") 
    for (i=1;i in oldA;i++) { 
     gsub(oldA[i],newA[i],str) 
    } 
    return str 
} 

{ print $1 tr("CGTA","gcat",substr($0,2)) } 

$ awk -f tst.awk file 
G 6472 193 0.0 0.0 193.0 0.0 0.0 g d 
T 6482 91 91.0 0.0 0.0 0.0 0.0 a  d 
G 7482 187 0.0 0.0 187.0 0.0 0.0 g d 
T 8860 74 0.0 0.0 0.0 74.0 0.0 t d 
G 9254 52 0.0 0.0 52.0 0.0 0.0 g d 
A 10059 78 78.0 0.0 0.0 0.0 0.0 a  d 
G 10476 757 0.0 1.0 755.0 1.0 0.0 g d 
G 16122 125 0.0 1.0 124.0 0.0 0.0 g d 
G 17053 316 0.0 0.0 316.0 0.0 0.0 g d 
G 19312 56 0.0 0.0 55.0 1.0 0.0 g d 
0

结合肯特的答案,shellters回答的意见,我想出了这个剧本,让我改变国会大厦到国会大厦和保持原来的白色香料。

awk ' 
     BEGIN{d["G"]="C";d["C"]="G";d["T"]="A";d["A"]="T";FS="";OFS=""} 
     {for(i=2;i<(NF+1);i++) 
       {if($i in d) 
         $i=d[$i]} 
           } 
     {print}' $1 

Output: 
G 6472 193 0.0 0.0 193.0 0.0 0.0 G d 
T 6482 91 91.0 0.0 0.0 0.0 0.0 A  d 
G 7482 187 0.0 0.0 187.0 0.0 0.0 G d 
T 8860 74 0.0 0.0 0.0 74.0 0.0 T d 
G 9254 52 0.0 0.0 52.0 0.0 0.0 G d 
A 10059 78 78.0 0.0 0.0 0.0 0.0 A  d 
G 10476 757 0.0 1.0 755.0 1.0 0.0 G d 
G 16122 125 0.0 1.0 124.0 0.0 0.0 G d 
G 17053 316 0.0 0.0 316.0 0.0 0.0 G d 
G 19312 56 0.0 0.0 55.0 1.0 0.0 G d 
相关问题