첫 번째 열을 기준으로 두 파일을 비교합니다. 일치하는 경우 행 유지 [닫기]

첫 번째 열을 기준으로 두 파일을 비교합니다. 일치하는 경우 행 유지 [닫기]

안녕하세요,

두 개의 csv 파일이 있습니다: File1(약 18800행):

            p1  p10 p16 p19 p25 p3  p5  p6  p8  p9
    A3      567 0   3   0   18  17  8   4   6   7
    B23     490 7   6   2   23  26  20  14  12  29
    A56     737 1   4   1   6   4   1   4   8   5
    Z56     145 6   4   0   11  17  5   9   22  11
    D89     68  0   0   34  4   0   0   0   0   0
    A12     46  0   0   8   0   0   0   0   0   0
    A15     72  0   0   8   0   1   0   0   0   0
    D4      40  0   0   0   0   1   5   18  0   0
    Z6       7  0   1   0   1   1   10  1   2   0
    X3      49  0   0   125 0   0   0   0   0   0

파일 2(약 400줄)

        name    tax price class order 

        B23      kat 35    2      1
        Z56      mat 26    3      2
        D4       kat 26    4      1

이제 이 두 파일을 첫 번째 열로 비교하고 싶습니다. 두 번째 파일의 값이 첫 번째 파일에 있으면 일치하는 줄 전체를 유지하고 싶습니다. 다음은 샘플 출력입니다.

            p1  p10 p16 p19 p25 p3  p5  p6  p8  p9
    B23     490 7   6   2   23  26  20  14  12  29
    Z56     145 6   4   0   11  17  5   9   22  11
    D4      40  0   0   0   0   1   5   18  0   0

편집기: File1cat

    "","p1","p10","p16","p19","p25","p3","p5","p6","p8","p9"
"p1_1_length_2509_cov_19.337112",567,0,3,0,18,17,8,4,6,7
"p1_10_length_1072_cov_559.052910",4900,7,6,2,23,26,20,14,12,29
"p1_11_length_1032_cov_5800.211050",73784,1,4,1,6,4,1,4,8,5
"p1_12_length_1022_cov_10156.344134",145873,6,4,0,11,17,5,9,22,11
"p1_13_length_946_cov_7.164835",77,17936,61876,5257,6085,196,8383,24956,4656,14687
"p1_14_length_921_cov_15.662469",68,0,0,34,4,0,0,0,0,0
"p1_16_length_800_cov_7.126300",46,0,0,8,0,0,0,0,0,0
"p1_17_length_758_cov_12.328051",72,0,0,8,0,1,0,0,0,0
"p1_19_length_722_cov_5.621849",40,0,0,0,0,1,5,18,0,0

파일 2 고양이:

name,superkingdom,phylum,class,order,family,genus,species
p10_1003_length_529_cov_12.940299,Viruses,,,,Poxviridae,Alphaentomopoxvirus,Anomala cuprea entomopoxvirus
p10_1021_length_525_cov_6.801508,Viruses,,,Herpesvirales,Alloherpesviridae,Batrachovirus,Ranid herpesvirus 1
p10_1047_length_521_cov_4.852792,Viruses,,,,,,Hudisavirus sp.
p10_1152_length_501_cov_22.430481,Viruses,,,,Mimiviridae,Cafeteriavirus,Cafeteria roenbergensis virus
p10_139_length_1152_cov_892.463415,Viruses,,,,,,Hudisavirus sp.
p10_149_length_1130_cov_7.540379,Viruses,,,Picornavirales,Picornaviridae,Enterovirus,Enterovirus C

답변1

첫 번째 파일의 첫 번째 열이 두 번째 파일의 열에 해당하는 모든 행을 추출하려고 합니다.

첫 번째 파일의 첫 번째 열에는 텍스트만 포함되어 있는 것 같으므로(나머지는 숫자임) 간단히 grep이를 사용할 수 있습니다.

bash프로세스 대체를 이해하는 다른 쉘 에서 이는 문제가 될 수 있습니다.

grep -F -f <( awk -F, 'NR > 1 { print $1 }' <file2 ) file1 >newfile

다른 셸에서는 먼저 명령 출력을 awk임시 파일에 쓴 다음 이를 grep -f.

awk다음과 유사한 출력을 생성 합니다 .

p10_1003_length_529_cov_12.940299
p10_1021_length_525_cov_6.801508
p10_1047_length_521_cov_4.852792
p10_1152_length_501_cov_22.430481
p10_139_length_1152_cov_892.463415
p10_149_length_1130_cov_7.540379

grep첫 번째 파일의 모든 행과 일치하기 위해 이를 고정 문자열 패턴으로 사용합니다 .

awk먼저 두 번째 파일의 첫 번째 열을 연관 배열의 키로 읽은 다음 해당 키에 대해 첫 번째 파일의 첫 번째 열을 테스트하는 작업을 포함하는 모든 작업을 수행할 수도 있습니다 .

awk -F, 'NR==FNR && FNR>1 { keys[sprintf("\"%s\"", $1)] }
         NR!=FNR && FNR>1 && ($1 in keys)' file2 file1

이상합니다 sprintf(). 첫 번째 열이 file1큰따옴표로 묶여 있기 때문입니다. 에서 읽은 데이터에 큰따옴표를 추가하기만 하면 됩니다 file2.

에서 시작하면 FNR>1.NR==FNRfile2

답변2

이는 단순히 하나의 스트림으로 작업하는 것이 아니기 때문에 스크립팅 언어보다는 프로그래밍 언어와 가장 잘 어울리는 작업입니다. 기본 알고리즘은 다음과 같습니다.

  1. 첫 번째 파일을 한 줄씩 읽습니다. 모든 첫 번째 요소의 목록을 구성합니다. (사용하는 언어에 따라 해시 또는 사전이 가장 효율적일 수 있습니다.)
  2. 두 번째 파일을 한 줄씩 읽습니다. 첫 번째 요소가 목록의 #1에 있으면 이를 출력 파일에 저장합니다.

관련 정보