假设我有 2 个文件 ABC.txt 和 DEF.txt,数据如下所示:
ABC.txt:
abc 14
dka 1
def 51
DEF.txt:
def 12
ckd 41
我想从两个文件中 grep 列 1 和 2 并写入第三个文件,以便第三个文件包含两个文件,没有任何重复的列 1 和为两个文件放置的第三个值,并为文件中不存在的值放置零。如何做呢?
我的预期输出是(输出:
ABC DEF
abc 14 0
ckd 0 41
def 51 12
dka 1 0
答案1
$ join -j 1 -a 1 -a 2 -o 0,1.2,2.2 -e 0 <(sort ABC.txt) <(sort DEF.txt)
abc 14 0
ckd 0 41
def 51 12
dka 1 0
标题和列间距留作练习。
答案2
Awk
解决方案:
awk 'BEGIN{
OFS="\t"; print "", "ABC", "DEF"
}
NR==FNR{ a[$1]=$2; next }
{
if ($1 in a) { v=a[$1]; delete a[$1] }
$3 = v+0
}1;
END{ for(i in a) print i, 0, a[i] }' DEF.txt ABC.txt
输出:
ABC DEF
abc 14 0
dka 1 0
def 51 12
ckd 0 41
答案3
GNU 数据混合有一个交叉表(数据透视表)选项,对于这类事情来说非常好 - 尽管您的数据需要一些预处理:
awk '{print $0, substr(FILENAME,1,length(FILENAME)-4)}' ABC.txt DEF.txt |
datamash -Ws --filler='0' crosstab 1,3 unique 2
ABC DEF
abc 14 0
ckd 0 41
def 51 12
dka 1 0