두 개의 파일이 있습니다 file1.txt
. file2.txt
열 2와 3을 기준으로 둘 모두에 공통된 레코드를 선택 file1.txt
하고 이를 추가 열(열 4)에 복사하고 싶습니다.file2.txt
out.txt
file2.txt
입력 예:
file1.txt
abc 1 a f11 f13 f14
abd 2 b f12 f14 f13
abe 4 d f13 f16 f12
acf 5 s f14 f15 f19
file2.txt
abc 1 a f21 f23 f24
abd 1 b f21 f24 f23
abe 4 d f24 f26 f22
acf 6 s f23 f25 f29
원하는 출력
out.txt
abc 1 a f11 f13 f14 f21
abe 4 d f13 f16 f12 f24
저도 비슷한 질문을 했어요질문3개의 파일을 활용하여 유사한 입력을 바탕으로 유사한 출력을 추출하는 방법에 대해서는 앞서 설명을 드린 바 있습니다. 저는 Unix 세계를 처음 접했고 파일 처리 방법을 배우고 있습니다. 이를 바탕으로 아래 코드를 사용해 보았 awk
으나 성공하지 못했습니다. 누군가가 무엇이 잘못되었는지 확인하고 제안할 수 있습니까?
awk 'FILENAME == ARGV[1] {
m[$2,$3] = 0; z[$2,$3] = $6;
next;
}
{
if (($2,$3) in m && m[$2,$3] == 1) {
print $0 " " z[$2,$3] >"out.txt";
}
}' file2.txt file1.txt
답변1
앗
awk 'FNR==NR {
a[$2, $3]=$4
next
}
($2, $3) in a{
print $0, a[$2, $3]
}
' file2.txt file1.txt > out.txt
가입하다
join -j 2 \
<(sort -k2,3 file2.txt | sed 's/ /+/2') \
<(sort -k2,3 file1.txt | sed 's/ /+/2') \
-o 1.1,1.2,1.3,1.4,1.5,2.3 |
sed 's/+/ /' > out.txt
답변2
귀하의 예에서는 값이 0인 배열 m을 생성합니다. 1로 설정할 수 없으며 설정할 필요도 없습니다. $0와 같이 전체 행에 값을 설정할 수 있습니다.
이 시도:
awk 'FILENAME == ARGV[1] {
m[$2,$3] = $0;
next;
}
{
if (($2,$3) in m) {
print m[$2,$3] " " $4 >"out.txt";
}
}' file1.txt file2.txt