중복된 항목이 있는 두 개의 다른 파일에서 vlookup이 필요합니다.
파일 1
abc 10
xyz 20
bhy 30
hgf 40
파일 2
a abc
b xyz
c bhy
d abc
e abc
f xyz
원하는 출력:
abc 10 a,d,e
xyz 20 b,f
bhy 30 c
hgf 40 Not_Available
답변1
Awk
해결책:
awk 'NR == FNR { a[$1] = $2 OFS; next }
$2 in a { a[$2] = a[$2] (a[$2] ~ /\t$/? "" : ",") $1 }
END { for (i in a) print i, a[i] }' OFS='\t' file1 file2
산출:
bhy 30 c
abc 10 a,d,e
xyz 20 b,f
마지막 조건의 경우 다음 수정 사항을 사용하십시오.
awk 'NR == FNR { a[$1] = $2 OFS; next }
$2 in a { a[$2] = a[$2] (a[$2] ~ /\t$/? "" : ",") $1 }
END {
for (i in a) print i, a[i] (a[i] ~ /\t$/? "Not_Available" : "")
}' OFS='\t' file1 file2
답변2
awk를 사용하세요
awk -v OFS='\t' '
NR == FNR {val[$1]=$2; next}
{items[$2] = items[$2] " " $1}
END {
for (a in val) {
sub(/^ /, "", items[a])
gsub(/ /, ",", items[a])
print a, val[a], items[a]
}
}
' file1 file2
bhy 30 c
abc 10 a,d,e
xyz 20 b,f
정렬하고 싶다면 다음을 입력하세요.| sort -k2,2n
단지 재미를 위해 약간의 Perl 트릭을 사용했습니다.
perl -lae '
if ($. == ++$nr) { $val{$F[0]} = $F[1] }
else { push @{$items{$F[1]}}, $F[0] }
} continue {
close ARGV if eof
} END {
printf "%s\t%s\t%s\n", $_, $val{$_}, join(",", @{$items{$_}}) for keys %items
' file1 file2