我正在嘗試使用awk來比較兩個檔案,我想根據三個條件來組合它們。
- 第2列等于第1列
- 第2列等于第1列 。
- 第3列大于或等于第2列 。
- 第3列小于或等于第3列
這些檔案看起來像這樣:
file1
snp1 14 6371334
snp2 14 7928189
snp3 14 31819743
snp4 14 62133529
蛇5 14 62616434
蛇6 14 17544926
snp7 14 31639444
file2
14 71159186 72228540 31
14 15732809 16677121 68
14 45003977 46299534 69
14 61965465 64286878 128
14 17378950 17833828 141
14 12877549 13217565 193
14 31369019 31785149 194
14 49883707 49905143 197
而期望的輸出將是:
snp1 14 6371334 0
snp2 14 7928189 0
snp3 14 31819743 0
snp4 14 62133529 128
蛇5 14 62616434 128
狙擊手6 14 17544926 141
Snp7 14 31639444 194
我試過這樣做:
awk 'NR==FNR {a[$1]=$1;b[$2]=$2;c[$3]=$3;d[$4]=$4;next} {if($2 in a && $3 >= b[$2] && $3 <= c[$3]) print 1,2,3,d[$4]}' file2 file1
但它并不像那樣作業。
有什么幫助嗎?
謝謝!
uj5u.com熱心網友回復:
看起來,也許你想給一個snp指定一個區間
。
也就是說,如果一個snp在某個區間內
,則報告一個與區間相關的識別符號。
報告一個與該區間相關的識別符號。
我幾乎不喜歡看到的情況包括使用NR==FNR模式
而沒有相應的NR!=FNR模式。
四個獨立的陣列,每個鍵都是其值的重復
。
......你能用它做什么呢?
在同一行中的任何專案都不可能相互關聯,除非是偶然。
并不是說你應該這樣做...
但你所想的可能是用這樣的結構來實作更好的服務:
a[NR]=$1;b[NR]=$2 ....
在這里,由于在同一行上的專案是可以恢復的
第一個塊中的尾部;next可能沒有任何幫助。 因為它是 awk 的自然行為,在沒有被告知的情況下繼續下去。
第二個塊還沒有接受awk的本質...
條件是在區塊前的隱式if中
類似于
的東西NR != FNR && $1 in a ... {print ...
如果可能的話,你通常希望先得到一個小得多的檔案 然后流經第二個檔案,特別是如果第二個檔案大得多。
注意:你的樣本似乎有未被利用的順序
。一個綱要可能看起來像
將file1讀入陣列,保持順序
從file1到file2處理第一個專案,直到
找到或不存在被確定。
繼續處理檔案1中的下一個專案(從你在檔案2中的位置繼續)。
沖洗 & 重復
我可以為你做你的作業,但你最好自己再做一次。
考慮到一些
我可以為你做作業,但你最好自己再做一次。 所提出的一些觀點 如果你又被卡住了,請把你的更接近的近似值貼出來 如果你再次陷入困境,請發表你更接近于可能作業的東西,我會回來檢查。
uj5u.com熱心網友回復:
用GNU awk來處理陣列的陣列,并假設一個值對于一個給定的鍵只能在一個范圍內:
$ cat tst.awk
NR==FNR {
ranges2vals[1][2 FS 3] = 4
下一個
}
{ val = 0 }
2美元在 ranges2vals中 {
for (range in ranges2vals[2]) {
split(range,r)
if ( (r[1] <=3) && (3 <=r[2]) ) {
val = ranges2vals[2][range] 。
休息
}
}
}
{ print $0, val }
$ awk -f tst.awk file2 file1
snp1 14 6371334 0
snp2 14 7928189 0
snp3 14 31819743 0
snp4 14 62133529 128
snp5 14 62616434 128
狙擊手6 14 17544926 141
Snp7 14 31639444 194
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/318319.html
標籤:
上一篇:區塊鏈專題研究報告(合集)
