Text-Processing

用值替換文本

  • July 8, 2018

我有兩個文件需要合併為一個。

文件 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”

引用自:https://unix.stackexchange.com/questions/453855