簡體   English   中英

根據兩個共同的列連接兩個文件

[英]Join Two Files Based on TWO Columns in Common

我有兩個文件正在嘗試基於第一列和第二列加入/合並。 下面是所需的輸出,我正在尋找。 我想強調一件事,我想合並這兩個文件,而不僅僅是交集。 任何幫助將不勝感激!

$ cat file1
2L      5753   33158
2L      8813   33158
2L      7885   33159
2L      1279   33159
2L      5095   33158
$
$ cat file2
2L      8813    0.6    1.2
2L      5762    0.4    0.5
2L      1279    0.5    0.9
$

Desired Output:
2L      5753                33158
2L      8813    0.6    1.2  33158
2L      7885                33159
2L      1279    0.5    0.9  33159
2L      5095                33158
2L      5762    0.4    0.5

我發現了一個類似的帖子,但似乎需要一些調整才能滿足我的想法。 URL 是: 類似的 Stackoverflow 鏈接

gawk

$ gawk -F$'\t' -v OFS=$'\t' 'FNR==NR{l[$1,$2]=$0; next}  
                       l[$1,$2]{print l[$1,$2],$3; delete l[$1,$2]; next} 
                        {print $1,$2,OFS,$3}
                        END{for (e in l) if(l[e]) print l[e]}' f2 f1
2L  5753            33158
2L  8813    0.6 1.2 33158
2L  7885            33159
2L  1279    0.5 0.9 33159
2L  5095            33158
2L  5762    0.4 0.5

這假設\\t分隔字段。

以下 bash 腳本讀取 file1 中的每一行,從 file2(的副本)中提取相應的行,合並這兩行,並將結果打印到 stdout。 最后,file2(剩下的)被打印出來。

temp=$(mktemp)
cp file2 $temp
while read col1 col2 arg3; do
  line=$(sed -r -i -e "/^$col1\ +$col2/ {w /dev/stdout" -e "d}" $temp)
  arg1=$(awk '{print $3}' <<< $line)
  arg1=${arg1:-   }
  arg2=$(awk '{print $4}' <<< $line)
  arg2=${arg2:-   }
  echo -e "$col1\t$col2\t$arg1    $arg2\t$arg3"
done < file1
cat $temp
rm $temp

sed命令的想法取自 dhakimian 對 Gilles 關於使用sed打印和刪除文件第一行的回答的擴展。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM