파일이 주어지면:
1.txt
1, abc, 123, 456, 789
2, lmn, 123, 456, 789
3, pqr, 123, 456, 789
2.txt
1, abc, 123, 000, 000
3, lmn, 123, 000, 000
9, opq, 123, 000, 000
출력.txt
ID, NAME, X, 1A, 1B, 2A, 2B
1, abc, 123, 456, 789, 000, 000
2, lmn, 123, 456, 789, MISSING, MISSING
3, pqr, 123, 456, 789, 000, 000
9, opq, 123, MISSING, MISSING, 000, 000
나는 사용했다이것참고용.
나는 다음을 사용해 보았습니다.
join -t , -a1 -a2 -1 1 -2 1 -o 0 -o 1.2 -o 1.3 -o 1.4 -o 1.5 -o 2.4 -o 2.5 -e "MISSING" 1.txt 2.txt
다음을 생성합니다.
1, abc, 123, 456, 789, 000, 000
2, lmn, 123, 456, 789,MISSING,MISSING
3, pqr, 123, 456, 789, 000, 000
9,MISSING,MISSING,MISSING,MISSING, 000, 000
도움이 필요하세요?
답변1
혼자서 는 할 수 없을 것 같아요 join
. 당신은 할 수 있습니다 :
join -t, -a1 -a2 -o0,1.2,1.3,1.4,1.5,2.2,2.3,2.4,2.5 -e MISSING 1.txt 2.txt |
perl -F, -lape '@F[1..2]=@F[5..6] if $F[1] eq "MISSING";
$_=join",",@F[0..4],@F[7..8]'
-p
: sed/awk와 같이 한 줄씩 읽기 루프를 사용합니다.-a
,-F,
: awk와 마찬가지로 행을 필드(배열@F
)로 분할합니다.-l
: 행의 내용에 대해 작동합니다(awk
입력이RS
($/
)에서 분할되는 경우(그러나RS
에는 포함되지 않음$0
) 및ORS
($\
)가 인쇄 전에 추가되는 경우와 같이 작동합니다).-e ...
: 각 줄에 대해 평가할 perl [e] 표현식입니다.- 그런 다음 거의 영어와 비슷하게 읽습니다. 필드 1(인덱스가 0에서 시작하는 두 번째 필드)이 "MISSING"인 경우 필드 1~2는 필드 5~6으로 설정됩니다. 그런 다음 현재 레코드의 내용($_는 awk의 $0과 같습니다)을 필드 0~4 및 7~8로 설정합니다.
실제로 동일한 내용을 작성하는 것은 awk
더 이상 복잡하지 않습니다.
awk -F, -vOFS=, '$2 == "MISSING"{$2=$6;$3=$7}
{print $1,$2,$3,$4,$5,$8,$9}'
답변2
단지 awk를 사용하여:
awk -F, -v OFS=, '
BEGIN {m = " MISSING"}
# process file1
NR == FNR {lines[$1] = $0; next}
# process file2
{
added[$1] = $4 OFS $5
if (!($1 in lines)) {
$4 = m
$5 = m
lines[$1] = $0
}
}
# print the combined output
END {
for (id in lines) {
if (!(id in added))
added[id] = m OFS m
print lines[id], added[id]
}
}
' 1.txt 2.txt | sort -n
1, abc, 123, 456, 789, 000, 000
2, lmn, 123, 456, 789, MISSING, MISSING
3, pqr, 123, 456, 789, 000, 000
9, opq, 123, MISSING, MISSING, 000, 000
답변3
처음 세 개의 필드에 참여하고 싶은 것 같습니다. 그런 다음 join
새 첫 번째 필드에서 처음 두 개의 구분 기호를 변경한 다음 구분 기호를 복원해야 합니다 .
join -t, -j1 -a1 -a2 -o 0 1.2 1.3 2.2 2.3 -e " MISSING" \
<(sed 's/, /\x02/;s/, /\x02/' 1.txt) <(sed 's/, /\x02/;s/, /\x02/' 2.txt) \
| sed 's/\x02/, /g'
보고
1, abc, 123, 456, 789, 000, 000
2, lmn, 123, 456, 789, MISSING, MISSING
3, pqr, 123, 456, 789, 000, 000
9, opq, 123, MISSING, MISSING, 000, 000