Bash에서 다른 파일의 두 값을 기반으로 하나의 CSV 파일 행을 조정합니다.

Bash에서 다른 파일의 두 값을 기반으로 하나의 CSV 파일 행을 조정합니다.

두 개의 CSV 파일이 있습니다.

  • 하나는 긴 열입니다: Chr_Name, h, j, start_pos, end_pos.
  • 다른 하나 는 열과 Chr_Name.position

Chr_Name첫 번째 파일을 기준으로 첫 번째 파일의 줄을 필터링한 다음 첫 번째 파일의 시작과 끝 사이의 위치를 ​​기준으로 줄을 필터링 해야 합니다 .

어떻게 해야 하나요?

예:

  • 파일 1:
    Chrk, 10, 20,  1010, 1025
    Chrk, 20, 10, 1020, 1040
    ChrM, 10, 10, 50, 120
    
  • 파일 2:
    Chrk, 1030
    ChrM, 70
    
  • 필수 출력 파일:
    Chrk, 20, 10, 1020, 1040
    ChrM, 10, 10, 50, 120
    

답변1

다음과 같은 두 개의 CSV 파일이 있다고 가정해 보겠습니다.

$ cat file1
Chr_Name,h,j,start_pos,end_pos
Chrk,10,20,1010,1025
Chrk,20,10,1020,1040
ChrM,10,10,50,120
$ cat file2
Chr_Name,position
Chrk,1030
ChrM,70

당신은 그것을 사용할 수 있습니다밀러( mlr) 도착하다가입하다공통 필드에 두 개의 파일 Chr_Name,필터position와 finally 사이의 필드 가 있는 레코드만 추출하여 start_pos결과 데이터를 가져옵니다.end_pos자르다position데이터에 불필요한 필드가 있습니다.

$ mlr --csv join -f file2 -j Chr_Name then filter '$start_pos <= $position && $position <= $end_pos' then cut -x -f position file1
Chr_Name,h,j,start_pos,end_pos
Chrk,20,10,1020,1040
ChrM,10,10,50,120

명령 mlr의 형식은 다음과 같습니다.

mlr --csv \
    join -f file2 -j Chr_Name then \
    filter '$start_pos <= $position && $position <= $end_pos' then \
    cut -x -f position \
    file1

위와 동일한 두 파일을 사용하지만 SQLite3 및 메모리 내 데이터베이스를 사용합니다.Marcus Müller가 의견에서 제안했듯이:

$ sqlite3 :memory: '.mode csv' '.headers on' '.import file1 file1' '.import file2 file2' 'SELECT file1.* FROM file1 JOIN file2 ON (file1.Chr_Name = file2.Chr_name) WHERE CAST(position AS INTEGER) BETWEEN start_pos AND end_pos'
Chr_Name,h,j,start_pos,end_pos
Chrk,20,10,1020,1040
ChrM,10,10,50,120

SQLite3 문:

.mode csv
.headers on
.import file1 file1
.import file2 file2

SELECT file1.* FROM file1
    JOIN file2 ON (file1.Chr_Name = file2.Chr_name)
    WHERE CAST(position AS INTEGER) BETWEEN start_pos AND end_pos

대시 명령은 두 파일을 테이블로 가져오고 file1명령문 file2SELECT실제 쿼리를 실행합니다.

답변2

s 뒤에 실제로 공백이 있는지 여부에 관계없이 awk를 사용하십시오 ,.

$ awk -F', *' 'NR==FNR{a[$1]=$2; next} ($1 in a) && ($4 <= a[$1]) && (a[$1] <= $5)' File2 File1
Chrk, 20, 10, 1020, 1040
ChrM, 10, 10, 50, 120

관련 정보