공통 필드를 기반으로 두 파일을 연결하고 명령을 사용하여 파일로 출력하려고 합니다 join
.
파일 1:
C01:Nancy:Jones:[email protected]
C02:Barbara:Madison:[email protected]
C03:Tim:Adams:[email protected]
C04:Sarah:Moore:[email protected]
C05:John:Polk:[email protected]
C06:Paula:Jacobs:[email protected]
파일 2:
R001:07/04/15:123.45:C01
R002:12/20/15:167.50:C03
R003:03/14/16:298.00:C06
R005:09/15/16:36.50:C03
R005:11/27/16:58.00:C02
R006:02/28/17:72.98:C05
예상 출력
C01:Nancy:Jones:[email protected]:R001:07/04/15:123.45
C02:Barbara:Madison:[email protected]:R005:11/27/16:58.00
C03:Tim:Adams:[email protected]:R002:12/20/15:167.50
C03:Tim:Adams:[email protected]:R004:09/15/16:36.5
C05:John:Polk:[email protected]:R006:02/28/17:72.9
C06:Paula:Jacobs:[email protected]:R003:03/14/16:298.00
먼저 필드 4를 기준으로 정렬을 시도한 File2
다음 새 파일로 출력했습니다.
sort -t: -k 4 File2 > File22
그럼 가입해
join -t: -1 1 -2 4 -o '1.1 1.2 1.3 1.4 2.1 2.2 2.3' File1 File22 > File 3
하지만 항상 빈 출력 파일이 나타납니다. 또한 누락을 처리하는 방법을 잘 모르겠습니다.4호선from File1
과 이 사실은 C03
에서 두 번 나타납니다 File2
.
답변1
원하는 방식으로 작업을 수행하려면 두 가지 작업을 수행해야 합니다. 먼저 > File 3
출력을 명령으로 리디렉션 File
하고 명령 끝에 추가 매개변수를 추가하여 명령 3
에 추가 매개변수를 추가할 수 있습니다.join
왜 이런 일이 발생하는지 설명하기 위해 최근에 (우연히!) 비슷한 질문에 답변했습니다.매뉴얼 페이지 리디렉션의 이상한 동작. 기본적으로 Bash 구문에 관한 내용이며 에서 자세한 내용을 읽을 수 있습니다 man bash
.
동작을 수정하려면 출력 파일에 공백이 없는지 확인하거나 공백을 이스케이프해야 하거나 파일 이름을 따옴표로 묶어야 합니다. 다음 리디렉션 중 하나가 작동합니다.
... > File3
... > File\ 3
... > "File 3"
이제 출력에서 누락된 레코드를 수정합니다. 이는 -a
플래그에 의해 처리됩니다. 에서 man join
:
-a FILENUM also print unpairable lines from file FILENUM, where FILENUM is 1 or 2, corresponding to FILE1 or FILE2
tee
요약하자면 다음 명령이 저에게 효과적이었습니다( 출력을 표시하기 위해 리디렉션 대신 사용하겠습니다 ).
$ join -t: -1 1 -2 4 -o '1.1 1.2 1.3 1.4 2.1 2.2 2.3' -a 1 File1 <(sort -t: -k4 File2) | tee "File 3"
C01:Nancy:Jones:[email protected] :R001:07/04/15:123.45
C02:Barbara:Madison:[email protected] :R005:11/27/16:58.00
C03:Tim:Adams:[email protected]:R002:12/20/15:167.50
C03:Tim:Adams:[email protected]:R005:09/15/16:36.50
C04:Sarah:Moore:[email protected]:::
C05:John:Polk:[email protected]:::
C06:Paula:Jacobs:[email protected]:R003:03/14/16:298.00
답변2
밀러와 함께http://johnkerl.org/miller/doc/reference.html명령은
mlr --csv --implicit-csv-header --headerless-csv-output --fs ":" join --ul -l 4 -r 1 -j 4 --lp l --rp r -f file2.csv file1.csv
당신은
C01:R001:07/04/15:123.45:Nancy:Jones:[email protected]
C02:R005:11/27/16:58.00:Barbara:Madison:[email protected]
C03:R002:12/20/15:167.50:Tim:Adams:[email protected]
C03:R005:09/15/16:36.50:Tim:Adams:[email protected]
C05:R006:02/28/17:72.98:John:Polk:[email protected]
C06:R003:03/14/16:298.00:Paula:Jacobs:[email protected]