awk와 함께 CSV 데이터 사용

CSV 파일에서 개별 데이터를 가져와 grep 내에서 변수로 사용하는 방법을 찾고 있습니다. awk 명령. 어느 쪽이든 적절 해 보이지만이 작업을 적절하게 수행하는 방법을 모르겠습니다.

예를 들어 다음과 같은 TSV 형식의 데이터 세트가 있습니다.

ID Name Eye Color 1 Bill Blue 2 Sam Blue 3 Fred Brown 4 Joe Brown 5 Ted Blue 6 Bob Brown 

이것은 실제 데이터 세트가 아니지만 동일한 방식으로 작동합니다. 이것은 전체 단백질 결합 데이터베이스이고 TSV는 수백만 개의 항목과 수십 개의 열이있는 300MB이므로 깔끔하게 정리할 수 없습니다. 실물을 포함합니다.

파란 눈을 가진 개인의 행이 포함 된 파일을 만들고 싶어서 " ID " 열.이 경우에는 다음과 같이 표시됩니다.

1, 2, 5

" ID "는 " Grep " 명령을 사용하여 키워드를 검색합니다.

궁극적으로 다음과 같은 TSV 파일이 필요합니다. 1 Bill Blue 2 Sam Blue 5 Ted Blue

하지만 나는 보이지 않습니다. 알아낼 그것을하는 방법. awk 또는 grep을 사용하고 기준으로 ID 번호를 포함하여 각 항목에 대해 개별적으로 만들 수 있지만 사용중인 CSV에는 1200 개의 항목이 있으므로이 프로세스를 자동화하고 싶습니다.

아래는 코드입니다. 단일 항목에 대해 원하는 결과를 생성하지만 ID 번호를 사용하여 자동으로 검색하고 싶습니다.

BindindDB_All.tsv는 수백만 항목이 포함 된 내 소스 파일입니다. 이렇게하면 TSV라는 TSV가 생성됩니다. " new.tsv "는 ID (1 열)가 66106과 같은 BindindDB_All.tsv 파일의 전체 행을 포함합니다.

awk "$1 == 66106" BindingDB_All.tsv >> new.tsv 

다음과 같이하고 싶습니다.

awk "$1 == ID.csv" BindingDB_All.tsv >> new.csv 

어디에서 읽을 것인가 각 ID를 입력하고 new.csv에 줄을 인쇄 한 다음 다음 ID를 읽고 동일한 작업을 수행합니다.

CSV 파일에는 1200 개의 검색어가 포함되어 있으며 각각 고유 ID를 가진 수백만 개의 가능성과 비교할 수 있습니다. 다른 변수 내에서 ID를 찾을 수 있으므로 열 1 만 검색하는 데 필요합니다. 요약하자면 행의 1 열을보고 CSV 파일의 첫 번째 숫자와 비교 한 다음 일치하는지 확인해야합니다. 일치하지 않는 경우 1 열의 다음 행을 확인해야하며 일치하는 항목을 찾을 때까지 계속 확인해야합니다. 열 1이 CSV 첫 번째 데이터 포인트와 일치하는 행을 찾으면 행을 출력하고 싶습니다. 그런 다음 1200 개의 행을 모두 찾을 때까지 CSV의 두 번째 항목에 대해 반복하고 싶습니다.

아이디어가 있습니까? 루프 문제처럼 들리지만 어떻게해야할지 모르겠습니다.

편집 :

사람들이 여전히 기꺼이 도와 줄 것 같으므로 질문에 답해 보겠습니다. 게시되었습니다.

다음은 검색 매개 변수로 사용될 ID 번호가 포함 된 실제 데이터의 처음 6 개 항목입니다.

66106 66107 66108 66109 66110 50127715 

열 이름도없고 다른 데이터도 없습니다. 이들은 다른 파일 인 TSV에서 개별적으로 검색하고 싶은 값입니다. TSV 크기에 대해서도 잘못 알고 있습니다. 4GB TSV가 압축되어 있습니다. 300MB. 파일에 내 프로그램에서 볼 수있는 것보다 더 많은 항목이 포함되어 있습니다. 아래는 수백만 개 중 단일 항목의 예입니다.이 모든 데이터를 한 번에 가져와야하므로 트리밍이 불가능합니다. 옵션입니다.

50127715 CCCC (CCC) c1nc2N3 [C @ H] 4CCC [C @ H] 4N = C3N (C) C (= O) c2 [nH] 1 InChI = 1S / C18H27N5O / c1- 4-7-11 (8-5-2) 15-20-14-16 (21-15) 23-13-10-6-9-12 (13) 19-18 (23) 22 (3) 17 ( 14) 24 / h11-13H, 4-10H2,1-3H3, (H, 20,21) / t12-, 13 + / m1 / s1 CSRSQF SFDXYRFV-OLZOCXBDSA-N 50073697 5- 메틸 -2- (1- 프로필 부틸)-(6aR, 9aS) -3,4,5,8- 테트라 히드로 시클로 펜타 [4,5] 이미 다조 [2,1-b] 푸린 -4- one :: CHEMBL280307 Phosphodiesterase 1 Bos taurus 60 ChEMBL 10.1016 / s0960-894x (98) 00681-7 9990447 Ho, GD Silverman, L Bercovici, A Puchalski, C Tulshian, D Xia, Y Czarniecki, M Green, M Cleven, R Zhang, H Fawzi, A Schering-Plough 연구소 http://www.bindingdb.org/bind/chemsearch/marvin/MolStructure.jsp?monomerid=50073697 http://www.bindingdb.org/jsp/dbsearch/PrimarySearch_ki.jsp?energyterm=kJ/mole&tag=pol&polymerid=49000914&target=Phosphodiesterase+1&column=ki&startPg=0&Increment=50&submit=Search http://www.bindingdb.org/jsp/dbsearch/PrimarySearch_ki.jsp?energyterm=kJ/mole&tag=r21&monomerid=50073697&enzyme=Phosphodiesterase+1&column=ki&startPg=0&Increment=50&submit=Search 103,967,010 44,272,162 CHEMBL280307 ZINC28221715 1 MGSTATETEELENTTFKYLIGEQTEKMWQRLKGILRCLVKQLEKGDVNVIDLKKNIEYAASVLEAVYIDETRRLLDTDDELSDIQSDSVPSEVRDWLASTFTRKMGMMKKKSEEKPRFRSIVHVVQAGIFVERMYRKSYHMVGLAYPEAVIVTLKDVDKWSFDVFALNEASGEHSLKFMIYELFTRYDLINRFKIPVSCLIAFAEALEVGYSKYKNPYHNLIHAADVTQTVHYIMLHTGIMHWLTELEILAMVFAAAIHDYEHTGTTNNFHIQTRSDVAILYNDRSVLENHHVSAAYRLMQEEEMNVLINLSKDDWRDLRNLVIEMVLSTDMSGHFQQIKNIRNSLQQPEGLDKAKTMSLILHAADISHPAKSWKLHHRWTMALMEEFFLQGDKEAELGLPFSPLCDRKSTMVAQSQIGFIDFIVEPTFSLLTDSTEKIIIPLIEEDSKTKTPSYGASRRSNMKGTTNDGTYSPDYSLASVDLKSFKNSLVDIIQQNKERWKELAAQGEPDPHKNSDLVNAEEKHAETHS 칼슘 / 칼 모듈 린 의존성 3 “, 5” -고리 형 뉴클레오티드 포스 프 odiesterase 1A PDE1A_BOVIN P14100 Q08E30, Q28063

이 상자에서 TSV로 읽는 방법을 모르겠지만 50127715가 첫 번째 열인 ID 열입니다. 관심있는 ID 번호가 포함 된 초기 CSV 파일을 갖고 싶습니다. 첫 번째 열에서 한 번에 하나씩 큰 TSV ID 번호를 검색합니다. 번호가 첫 번째 열에 포함되어 있으면 해당 줄을 파일에 쓰고 다음 ID를 검색합니다. 모든 결과를 단일 파일로 만들고 싶습니다.

여기에 도달하기위한 모든 단계에서이 작업을 수행하는 더 쉬운 방법이있을 것입니다.하지만 어떻게 만드는지 확실하지 않습니다. 이것은 더 명확합니다. 열 1 내에서 " 66106 "에 대한 큰 TSV를 검색하고 전체 줄을 쓸 줄을 찾으면 파일. 그런 다음 " 66107 "를 검색하고 찾으면 동일한 파일에 추가합니다. 이렇게하면 수백만 개가 아닌 1200 개의 항목이있는 CSV 또는 TSV 일 수있는 단일 파일이 있습니다.

댓글

  • 그냥 파싱하지 않는 이유 TSV 직접? awk -F '\t'는 입력 필드를 탭으로 구분합니다. 실제로 기본적으로 awk는 연속 된 공백으로 필드를 구분합니다. 따라서 모든 파란 눈을 가진 사람들을 확보하고 헤더를 보존하려면 awk -F '\t' 'BEGIN { OFS="\t" } NR==1 { print } NR>1 && $3 = "Blue" { print }' 만 있으면됩니다.

test.tsv ", 위에 나열된 것과 동일한 입력이 있지만 비정상적인 출력이 생성되었습니다. 모든 눈 색깔은 " 파란색 "로 대체되었지만 나머지는 그대로 유지되었습니다.

  • $3 = "Blue"$3 == "Blue" 여야합니다. 전자는 할당이고 후자는 비교입니다.
  • CSV 또는 TSV입니까?
  • 요구 사항에 대한 정보를 한 번에 탐색 경로로 표시하는 것은 ' 좋은 솔루션을 얻기위한 좋은 접근 방식입니다. 질문을 수정 하여 본인이 무엇을 하려는지에 대한보다 진정으로 대표적인 예를 제공하세요. ' TSV 파일, CSV 파일 및 예상되는 출력 파일을 입력으로 포함하십시오. 모든 사용 사례를 다루어야합니다. 모든 일치 항목이 한 열의 값과 일치하는지 아니면 다른 열의 다른 일치 항목인지 등입니다. 문의 방법 을 참조하세요.
  • 답변

    $ awk -F"\t" "(NR==1) || ($3=="Blue")" file ID Name Eye Color 1 Bill Blue 2 Sam Blue 5 Ted Blue 

    당신이 정말로하려는 것은 새로운 예 에서처럼 ID가 고유하다고 가정하면 다음과 같습니다.

    awk -F"\t" "{ out="out_" $1 ".txt"; print > out; close(out) }" BindingDB_All.tsv 

    또는 각 출력 파일에 헤더를 포함하려는 경우 :

    awk -F"\t" " NR==1 { hdr=$0; next } { out="out_" $1 ".txt"; print hdr ORS $0 > out; close(out) } " BindingDB_All.tsv 

    댓글

    • 명확성을 위해 수정했지만 실제로는 파일이 1 개만 포함되어 있습니다. 데이터가 방대하기 때문에 데모 용으로 예제 세트를 만들려고했지만 ' 프로그래밍이 처음이라 ' ' 필요한 내용을 제대로 표현하고 있는지 확실하지 않습니다.

    답변

    현장에서 찾을 수있는 모든 사용자 ture, 나는 해결책이 있습니다. 내가 한 첫 번째 작업은 다음을 사용하여 TSV를 CSV로 변환하는 것입니다.

    sed "s/\t/,/g" filename_with_tabs > filename_with_commas.csv 

    그런 다음 찾고 있던 파일 코드를 검색하려면 다음을 수행하십시오.

    awk -F, "FNR==NR {h[$1] = $0; next} {print $0,h[$1]}" file1 file2 > new_file.csv 

    첫 번째 열에서 별도의 CSV에 포함 된 텍스트를 검색합니다. 이 경우 " file1 "는 검색 할 파일이고 " file2 "에는 검색 할 문자열이 포함됩니다. 두 파일 모두 CSV 형식입니다.

    이것은 file2에 포함 된 ID 중 하나와 일치하는 열 1에 특정 ID가있는 file1 내의 모든 행을 포함하는 별도의 CSV 파일을 생성했습니다.

    도움이되기를 바랍니다. 누군가 언젠가는 이것이 몇 주 동안 내 두뇌를 괴롭 혔기 때문입니다. 나도 해결책을 얻지 못했고 상사가 나에게 보여 주어야했습니다.

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다