我想知道是否可以基于相似部分將來自兩個檔案的資訊合并在一起。file1 是爆炸后的序列 ID,file2 包含與序列名稱中的前兩個數字對應的分類名稱。
檔案 1:
>301-89_IDNAGNDJ_171582
>301-88_ALPEKDJF_119660
>301-88_ALPEKDJF_112039
...
檔案2:
301-89--sample1
301-88--sample2
...
輸出:
>301-89_IDNAGNDJ_171582--sample1
>301-88_ALPEKDJF_119660--sample2
>301-88_ALPEKDJF_112039--sample2
檔案未排序,file1 包含更多行,其中前兩個數字類似于 file2 中一行中的前兩個數字。我正在尋找一些關于如何做到這一點的提示/幫助,可以這樣做嗎?我應該使用哪種命令或語言?
uj5u.com熱心網友回復:
使用awk
$ awk -F"[_-]" 'BEGIN{OFS="-"}NR==FNR{a[$2]=$4;next}{print $0,a[$2]}' file2 OFS="--" file1
>301-89_IDNAGNDJ_171582--sample1
>301-88_ALPEKDJF_119660--sample2
>301-88_ALPEKDJF_112039--sample2
uj5u.com熱心網友回復:
我想知道是否可以根據相似部分將兩個檔案中的資訊合并在一起
是的 ...
檔案未排序
...但前提是它們已排序。
如果我們對它們進行轉換以使分隔符保持一致,然后稍后再將其重新格式化,則更容易:
sed 's/>\([0-9]*-[0-9]*\)_\(.*\)$/\1 \2/' file1生產301-88 ALPEKDJF_112039 301-88 ALPEKDJF_119660 301-89 IDNAGNDJ_171582 ...我們可以通過管道
sort -k1sed 's/--/ /' f2生產301-89 sample1 301-88 sample2 ...我們可以用同樣的方式排序
join sorted1 sorted2(與前面步驟的排序結果)產生301-88 ALPEKDJF_112039 sample2 301-88 ALPEKDJF_119660 sample2 301-89 IDNAGNDJ_171582 sample1 ...最后,我們可以按照您最初想要的方式格式化這 3 個欄位,方法是通過管道
sed 's/\(.*\) \(.*\) \(.*\)$/\1_\2--\3/'
如果動態對它們進行排序是合理的,我們可以使用行程替換來做到這一點:
$ join \
<( sed 's/>\([0-9]*-[0-9]*\)_\(.*\)$/\1 \2/' f1 | sort -k1 ) \
<( sed 's/--/ /' f2 | sort -k1 ) \
| sed 's/\(.*\) \(.*\) \(.*\)$/\1_\2--\3/'
301-88_ALPEKDJF_112039--sample2
301-88_ALPEKDJF_119660--sample2
301-89_IDNAGNDJ_171582--sample1
...
如果對檔案進行排序是不合理的 - 即時或其他方式 - 你最終將在記憶體中構建一個哈希,就像awk答案正在做的那樣。試一試,看看哪個更快。
uj5u.com熱心網友回復:
(mawk/nawk/gawk -e/-ce/-Pe) '
FNR == !_ {
_ = ! ( ___=match(FS=FNR==NR ? "[-][-]" : "[>_]", "[>-]"))
$_ = $_
} FNR == NR { __[$!_]="--"$NF; next } sub("$", __[$___])' file2.txt file1.txt
———————————————————————————
>301-89_IDNAGNDJ_171582--sample1
>301-88_ALPEKDJF_112039--sample2
>301-88_ALPEKDJF_119660--sample2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/477871.html
