Text-Processing
用值替換文本
我有兩個文件需要合併為一個。
文件 1 範例:
gene_1 578 gene_2 565 gene_3 3 gene_4 77 gene_5 8 gene_6 0 gene_7 45 gene_8 67 gene_9 0 gene_10 65
文件 2 範例:
COG0430 gene_5 gene_9 COG1949 gene_1 gene_3 gene_6 COG5049 gene_2 gene_4 gene_7 gene_10 COG5104 gene_8
輸出文件應如下所示:
COG0430 8 0 COG1949 578 3 0 COG5049 565 77 45 65 COG5104 67
有誰知道可以解決這個問題的命令?
#!/bin/bash declare -A arr readarray -t lines < "file1" for line in "${lines[@]}"; do arr[${line%% *}]=${line#* } done readarray -t lines2 < "file2" for line in "${lines2[@]}"; do echo -n "${line%% *} " for word in $line; do echo -n "${arr[$word]} " done echo done
不是最乾淨的 bash,但它可以工作。還要確保你有 bash >= 4.2
這是一種方法
awk '/^gene/{a[$1]=$2}/^COG/{c=$1;for(b=1;b<=NF;b++){c=sprintf("%s%s%c",c,a[$b],b==NF?"":" ")}print c}' file1 file2 COG0430 8 0 COG1949 578 3 0 COG5049 565 77 45 65 COG5104 67
/gene/{a[$1]=$2}
查找開頭帶有“gene”的任何行,並創建一個數組,其中包含第一列的鍵(例如“gene_1”)和下一列的值(例如“578”)/^COG/
查找開頭帶有“COG”的任何行…c=$1
將變數 c 設置為第一列,例如“COG0430”{c=sprintf("%s%s%c",c,a[$b],b==NF?"":" "
不斷將每一列的數組條目附加到變數 c 中。如果它不是最後一列,請輸入空格分隔符。print c
然後只列印完全形成的變數“c”