有一个文件,我想在除第一个字段之外的所有字段上执行awk Gsub。有可变数量的字段,所以我想弄清楚我是否可以编写一个条件命令来应用除$ 1以外的所有字段。
如果有办法说$ {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
感谢。
答案 0 :(得分: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
答案 1 :(得分: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=""
。
答案 2 :(得分:0)
在评论中结合Kents答案和shellters答案,我想出了这个脚本,它允许我将capitols改为capitols并保持原来的白色香料。
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