두 가지 파일 중 모든 정보가 포함 된 세 번째 파일을 만들고 싶습니다.
파일 1 :
a 111
b 222
c 333
d 666
e 777
파일 2 :
111 x1
222 x2
333 x3
444 x4
555 x5
666 x6
777 x7
888 x8
다음과 같이 결합하고 싶습니다.
111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0
노트 :
파일 1의 두 번째 열은 파일 2의 첫 번째 열의 하위 집합입니다.
답변
join명령은 파일이 당신의 샘플로 분류되어 경우, 필요한 거의 수행합니다
join -12 -a2 file1 file2 -o2.1,2.2,1.1
일치하지 않는 행에 0을 추가하기 만하면됩니다. 이를 위해 -e스위치를 사용할 수 있습니다 .
join -12 -a2 file1 file2 -o2.1,2.2,1.1 -e0
답변
결합 사용하기 :
join -1 1 -2 2 -a1 -e0 -o'0,1.2,2.1' file2 file1
join 명령은 공통 데이터 필드를 공유하는 두 파일의 행을 결합합니다. 이 경우 : file2의 필드 1 ( -1 1)과 file1의 필드 2 ( )를 사용하여 file2와 -2 2file1을 결합하십시오.
출력 될 것이다 : “필드 접합, 파일 2의 필드 2, 필드 FILE1 1″( -o'0,1.2,2.1'), 누락 필드가 0을 넣어있을 경우 ( -e0)
두 파일 중 하나에 더 많은 레코드가있는 경우 해당 파일을 추가하십시오 (이 경우 file2) ( -a1)
join 명령 맨 페이지를 참조하십시오
답변
약간의 awk마술 :
awk 'FNR==NR{a[$2]=$1;next}{if(a[$1]==""){a[$1]=0}; \
printf "%s%s%s%s%s\n",$1,FS,$2,FS,a[$1]}' \
file1 file2
또는
awk 'FNR==NR{a[$2]=$1;next}{if(a[$1]==""){a[$1]=0};
print $1,$2,a[$1]}' file1 file2
산출
111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0
설명
-
FNR==NR{a[$2]=$1;next}file1(FNR==NR)를 초과 하여 키-값 구조를 만듭니다. 키는의 두 번째 열 ($2)이고file1값은 첫 번째 열 ($1)입니다.file1 -
{if(a[$1]==""){a[$1]=0};print $1,$2,a[$1]}통해 실행
file2및-
if(a[$1]==""){a[$1]=0}첫 번째 열에 키 (경우
$1에이)file2에 존재하지 않는file1, 우리는 필요0 -
print $1,$2,a[$1]인쇄 (하여
print제 번째 열)file2과 첫 번째 열의 키 (키와 값 구조 값$1의)을file2또는
-
printf "%s%s%s%s%s\n",$1,FS,$2,FS,a[$1]}'printf의 첫 번째 및 두 번째 열과file2키-값 구조의 값을 첫 번째 열의 키 ($1)로 인쇄 (사용 )합니다file2.-
FS입력 파일에서 가져온 열 사이의 구분 기호입니다. -
"%s%s%s%s%s\n"출력 형식입니다
-
%s-문자열 -
\n– 줄 바꿈
-
-
-
답변
q 사용 :
$ q "select f2.c1, f2.c2, ifnull(f1.c1,0) from file_2.txt f2 LEFT JOIN file_1.txt f1 on f1.c2 = f2.c1 "
111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0
때때로 이런 식으로 더 읽기 쉽습니다.