我有兩個檔案
file1
非編碼 X FlyBase 基因 20025099 20025170 . .gene_id "FBgn0052826"; gene_symbol "tRNA:Pro-GG-1-1";
非編碼 X FlyBase基因 19910168 19910521 . - .gene_id "FBgn0052821"; gene_symbol "CR32821";
非編碼 X FlyBase 基因 476857 479309 . - .gene_id "FBgn0029523"; gene_symbol "CR18275";
非編碼的 X 型 FlyBase 基因 15576355 15576964 。 .gene_id "FBgn0262163"; gene_symbol "betaNACtes5";
非編碼的X基因 19910168 19910521 . - .gene_id "FBgn0052821"; gene_symbol "CR32821";
檔案2
betaNACtes5
CR18275
28SrRNA-Psi:CR45859
CR32821
我想要的是:如果檔案2中的任何一行與檔案1的第13列(因""而部分匹配)相匹配,我希望將第4列中的字串改為 "假基因",否則就不做任何處理。
期望的輸出
非編碼 X FlyBase基因 20025099 20025170 . .gene_id "FBgn0052826"; gene_symbol "tRNA:Pro-GG-1-1";
非編碼 X FlyBase 假基因 19910168 19910521 . - .gene_id "FBgn0052821"; gene_symbol "CR32821";
非編碼 X FlyBase 基因 476857 479309 . - . gene_id "FBgn0029523"; gene_symbol "CR18275";
非編碼的 X FlyBase 假基因 15576355 15576964 . .gene_id "FBgn0262163"; gene_symbol "betaNACtes5";
非編碼 X FlyBase 假基因 19910168 19910521 . - .gene_id "FBgn0052821"; gene_symbol "CR32821"。
到目前為止,我可以得到匹配的資訊,但我不能做其他的事情。
grep -Ff file2 file1
uj5u.com熱心網友回復:
對于你顯示的樣本,請嘗試以下awk代碼。這也會保留Input_file1中的空白處。
awk'
BEGIN{ s1=""" }
FNR==NR{
arr[s1 $0 s1"; "]
下一個
}
{
match($0,/^([^[:space:]] [[:space:]] ){3}/)
firstPart=substr($0,RSTART,RLENGTH)
$0=substr($0,RSTART RLENGTH)
match($0,/^[^ ] /)
restPart=substr($0,RSTART RLENGTH)
print firstPart ($NF in arr? "pseudogene":substr($0,RSTART, RLENGTH)) restPart
}
' file2 file1
解釋:為上述內容添加詳細解釋。
awk ' ##從這里開始啟動awk程式。
BEGIN{ s1=""" } ##在BEGIN部分將s1設定為"。
FNR==NR{ ##檢查條件FNR==NR,當file2被讀取時,該條件為TRUE。
arr[s1 $0 s1";"] ##創建帶有s1當前行索引的arr陣列 s1在這里為半冒號。
next ##next將跳過從這里開始的所有后續陳述句。
}
{
match($0,/^([^[:space:]] [[:space:]] ){3}/) ##使用match函式,在這里匹配前3個欄位。
firstPart=substr($0,RSTART,RLENGTH) ##Saving matched part into firstPart to be used later on.
$0=substr($0,RSTART RLENGTH) ##將剩余的匹配行保存到當前行中。
match($0,/^[^ ] /) ##匹配從開始到當前行的第一個空格的所有內容,在這里得到第四個欄位和其余行的值。
restPart=substr($0,RSTART RLENGTH) ##創建restpart變數,這里有第4個欄位后的所有內容。
print firstPart ($NF in arr? "pseudogene":substr($0,RSTART,RLENGTH)) restPart ##Printing firstPart then pseudogene OR 4th field and restPart as per need.
}
' file2 file1 ##在這里提到Input_file的名字。
uj5u.com熱心網友回復:
使用GNU awk作為match()的第三個引數和s/S速記:
$ cat tst.awk
NR==FNR {
genes["""""1"";"]
下一個
}
$NF in genes {
match($0,/((S s ){3})S (.*)/, a)
$0 = a[1] "假基因" a[3] 。
}
{ print }
$ awk -f tst.awk file2 file1
非編碼 X FlyBase 基因 20025099 20025170 . .gene_id "FBgn0052826"; gene_symbol "tRNA:Pro-GG-1-1";
非編碼 X FlyBase基因 19910168 19910521 . - .gene_id "FBgn0052821"; gene_symbol "CR32821";
非編碼的 X 型 FlyBase 假基因 476857 479309 . - .gene_id "FBgn0029523"; gene_symbol "CR18275";
非編碼 X FlyBase 假基因 15576355 15576964 . .gene_id "FBgn0262163"; gene_symbol "betaNACtes5"。
另外,使用任何POSIX awk:
$ cat tst.awk
NR==FNR {
基因["""1美元";"]
下一個
}
$NF in genes {
match($0,/([^[:space:]] [[:space:]] ){3}/)
tail = substr($0,RLENGTH 1)
sub(/[^[:space:]] /,",tail)
$0 = substr($0,1,RLENGTH) "pseudogene" tail
}
{ print }
$ awk -f tst.awk file2 file1
非編碼 X FlyBase 基因 20025099 20025170 . .gene_id "FBgn0052826"; gene_symbol "tRNA:Pro-GG-1-1";
非編碼 X FlyBase基因 19910168 19910521 . - .gene_id "FBgn0052821"; gene_symbol "CR32821";
非編碼的 X 型 FlyBase 假基因 476857 479309 . - .gene_id "FBgn0029523"; gene_symbol "CR18275";
非編碼 X FlyBase 假基因 15576355 15576964 . .gene_id "FBgn0262163"; gene_symbol "betaNACtes5"。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/318122.html
標籤:
