[英]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.