두 가지 파일 중 모든 정보가 포함 된 세 번째 파일을 만들고 싶습니다.
파일 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 2
file1을 결합하십시오.
출력 될 것이다 : “필드 접합, 파일 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
때때로 이런 식으로 더 읽기 쉽습니다.