두 개의 다른 파일이 있고 첫 번째 열을 사용하여 해당 정보를 병합하고 싶습니다.
파일 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()
첫 번째 쉼표 문자까지 행을 스트라이프하여 열을 제거하므로 나머지 내용은 열의 값이 됩니다.열쇠나중에 사용하기 위해.