첫 번째 열을 사용하여 두 파일 병합

첫 번째 열을 사용하여 두 파일 병합

두 개의 다른 파일이 있고 첫 번째 열을 사용하여 해당 정보를 병합하고 싶습니다.

파일 1.txt

A,info1,info2
234,info3,info4
CD,info5,info6

파일 2.txt

234,ccc,bb
CD,aaa,dd

예상 출력.csv

A,info1,info2,,
234,info3,info4,ccc,bb
CD,info5,info6,aaa,dd

awk(내 스크립트가 아님)을 사용해 보았 join으나 grep원하는 결과를 얻지 못했습니다.

awk -F "," 'FNR==NR {h[$1] = $2;next} BEGIN{ OFS = "\t"} {print $0,$2?h[$1]:"0"}' file1.txt prova2.txt

그리고

join -a 1 <(sort file1.txt) <( sort file2.txt) > output.csv

누구든지 나를 도와줄 수 있나요?

답변1

두 파일의 필드 수가 동일한 경우 -o auto각 파일의 첫 번째 줄을 기준으로 각 줄의 필드 수를 채울 수 있습니다. 기본적으로 -e누락된 필드는 기본적으로 다음과 같은 옵션 값으로 채워집니다. 공백 문자이지만 어떤 문자로든 변경할 수 있습니다.당신이 원한다);

$ join -t, -a1 -o auto <(sort file1) <(sort file2)
234,info3,info4,ccc,bb
A,info1,info2,,
CD,info5,info6,aaa,dd

-t,또한 입력 및 출력 파일을 지정하기 위한 필드 구분 기호를 추가했습니다 .
file2에만 존재하는 행을 추가하려면 해당 행을 -a2명령에 추가하십시오.

위 명령은 아래 명령의 축약된 버전으로, 출력하려는 ​​필드를 명시적으로 나타냅니다.

join -t, -a1 -o0,1.2,1.3,2.2,2.3 <(sort file1) <(sort file2)

-o #.k파일 번호의 k번째# 필드를 인쇄합니다 .
-o 0페어링할 수 없는 라인이 여기에 출력됩니다.


또는 다음을 사용하십시오 awk.

awk 'BEGIN{ FS=OFS=","; na="" }
              { key=$1; sub(/[^,]*,/, "") }
NR==FNR       { file1[key]=$0; next }
(key in file1){ print key, file1[key], $0; delete file1[key] }

END{ for(key in file1) print key, file1[key], na, na }' file1 file2

실제로는 { key=$1; sub(/[^,]*,/, "") }첫 번째 열에서 백업을 가져온 다음 sub()첫 번째 쉼표 문자까지 행을 스트라이프하여 열을 제거하므로 나머지 내용은 열의 값이 됩니다.열쇠나중에 사용하기 위해.

관련 정보