주어진 파일:
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