Používání dat CSV s awk

Snažím se najít způsob, jak vzít jednotlivá data ze souboru CSV a použít je jako proměnnou v rámci grep nebo příkaz awk. Buď se jeví jako vhodné, ale nejsem si jistý, jak tomu říct, aby to provedl správně.

Mám například datovou sadu ve formátu TSV, která vypadá takto:

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

Toto není skutečná datová sada, ale chová se stejným způsobem. Toto je celá databáze vázající proteiny, TSV je 300 MB s miliony položek a desítkami sloupců, takže nemohu čistě zahrnout skutečnou věc.

Chci vytvořit soubor obsahující řádky s jednotlivci, kteří mají modré oko, proto jsem vytvořil soubor CSV, který je složen z " ID " sloupec, který by v tomto případě vypadal takto:

1, 2, 5

Tento soubor CSV obsahující " ID " bylo vygenerováno pomocí " Grep " příkaz k vyhledání klíčového výrazu.

Nakonec chci soubor TSV, který vypadá takto: 1 Bill Blue 2 Sam Blue 5 Ted Blue

Ale nemohu se zdát přijít na to jak to udělat. Mohu jej vytvořit individuálně pro každou položku pomocí awk nebo grep a včetně ID čísla jako kritéria, ale CSV, který používám, má 1200 položek, takže bych chtěl tento proces automatizovat.

Níže je kód , který vytvoří požadovaný výsledek pro jednu položku, ale chci použít čísla ID k automatickému vyhledávání.

BindindDB_All.tsv je můj zdrojový soubor s několika miliony záznamů. Tím se vytvoří TSV s názvem " new.tsv " a obsahuje celý řádek souboru BindindDB_All.tsv, kde se ID (ve sloupci 1) rovná 66106.

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

Chtěl bych udělat něco takového:

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

kde by se to četlo každé ID, vytiskněte řádek na new.csv, přečtěte si další ID a proveďte totéž.

Soubor CSV obsahuje 1 200 hledaných výrazů, které lze porovnat s několika miliony možností, každý s jedinečným ID. I potřebujete to POUZE prohledat sloupec 1, protože najde ID v jiné proměnné es v každém řádku.

Abych to shrnul, potřebuji, aby se podíval do sloupce 1 řádku, porovnal ho s prvním číslem v mém souboru CSV a zjistil, zda se jedná o shodu. Pokud se nejedná o shodu, musí zkontrolovat další řádek ve sloupci 1 atd., Dokud nenajde shodu. Když najde řádek, kde sloupec 1 odpovídá prvnímu datovému bodu CSV, chci, aby vydal řádek. Pak chci, aby se to opakovalo pro druhý záznam v CSV, dokud nenalezne všech 1200 řádků.

Nějaké nápady? Zní to jako problém se smyčkou, ale ani já nevím, jak to udělat.

EDIT:

Jelikož se zdá, že lidé jsou stále ochotni pomoci, pokusím se odpovědět na otázky které byly zveřejněny.

Zde je prvních 6 položek mých skutečných dat, která obsahují identifikační čísla, která budou použita jako parametry vyhledávání.

66106 66107 66108 66109 66110 50127715 

Neexistují žádné názvy sloupců, žádná další data. Jedná se o hodnoty, které chci hledat jednotlivě v jiném souboru, TSV. Také jsem nesprávně určil velikost TSV, mám 4 GB TSV, který komprimuje na 300 MB. Soubor obsahuje více položek, než umožňuje kterýkoli z mých programů, aby jej bylo možné rovnoměrně zobrazit. Níže je uveden příklad jediného záznamu z několika milionů. POTŘEBUJEM všechna tato data vytáhnout najednou, takže ořezávání není možnost.

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-methyl-2- (1-propylbutyl) – (6aR, 9aS) -3,4,5,8-tetrahydrocyklopenta [4,5] imidazo [2,1-b] purin-4- jeden :: CHEMBL280307 Fosfodiesteráza 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 Research Institute 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 44272162 103967010 CHEMBL280307 ZINC28221715 1 MGSTATETEELENTTFKYLIGEQTEKMWQRLKGILRCLVKQLEKGDVNVIDLKKNIEYAASVLEAVYIDETRRLLDTDDELSDIQSDSVPSEVRDWLASTFTRKMGMMKKKSEEKPRFRSIVHVVQAGIFVERMYRKSYHMVGLAYPEAVIVTLKDVDKWSFDVFALNEASGEHSLKFMIYELFTRYDLINRFKIPVSCLIAFAEALEVGYSKYKNPYHNLIHAADVTQTVHYIMLHTGIMHWLTELEILAMVFAAAIHDYEHTGTTNNFHIQTRSDVAILYNDRSVLENHHVSAAYRLMQEEEMNVLINLSKDDWRDLRNLVIEMVLSTDMSGHFQQIKNIRNSLQQPEGLDKAKTMSLILHAADISHPAKSWKLHHRWTMALMEEFFLQGDKEAELGLPFSPLCDRKSTMVAQSQIGFIDFIVEPTFSLLTDSTEKIIIPLIEEDSKTKTPSYGASRRSNMKGTTNDGTYSPDYSLASVDLKSFKNSLVDIIQQNKERWKELAAQGEPDPHKNSDLVNAEEKHAETHS vápenatý / kalmodulin dependentní 3″ , 5″ -cyklický nukleotid fosf odiesteráza 1A PDE1A_BOVIN P14100 Q08E30, Q28063

Nejsem si jistý, jak to v tomto poli přečíst jako TSV, ale 50127715 je první sloupec, sloupec ID. Chci, aby můj počáteční soubor CSV, obsahující zájmová čísla ID, prohledával velké TSV jedno identifikační číslo v prvním sloupci. Pokud je číslo obsaženo v prvním sloupci, chci, aby zapsal tento řádek do souboru, poté vyhledal další ID. Chci všechny výsledky v jediném souboru.

Jsem si jist, že během všech mých kroků, jak se sem dostat, je to jednodušší způsob, ale nejsem si jistý, jak to udělat toto jasnější. Chci, aby ve velkém TSV prohledal " 66106 " ve sloupci 1, a když najde řádek, do kterého zapíše celý řádek soubor. Poté vyhledejte " 66107 " a jakmile jej najde, přidá jej do stejného souboru. Tímto způsobem mám jediný soubor, může to být CSV nebo TSV, s 1200 položkami, spíše než několika miliony.

Komentáře

  • Proč ne jen analyzovat přímo TSV? awk -F '\t' oddělí vstupní pole podle karet. Ve skutečnosti awk ve výchozím nastavení odděluje pole souvislými mezerami. Chcete-li tedy získat všechny modrooké lidi (a zachovat záhlaví), stačí awk -F '\t' 'BEGIN { OFS="\t" } NR==1 { print } NR>1 && $3 = "Blue" { print }'.
  • Zkoušel jsem tento příkaz spustit na ukázkovém souboru s názvem " test.tsv " se stejným vstupem, jaký je uveden výše, ale vytvořil neobvyklý výstup. Prostě nahradila všechny barvy očí " modrou ", zatímco všechno ostatní zůstalo stejné.
  • $3 = "Blue" by měl být $3 == "Blue". První je úkolem, druhé je porovnáním.
  • Je to CSV nebo TSV?
  • Rozesílání informací o vašich požadavcích po drobečku není ' dobrý přístup k získání dobrého řešení. Upravte svoji otázku, abyste poskytli skutečně reprezentativní příklad toho, o co se ' snažíte. Jako vstup zahrňte soubor TSV, soubor CSV a očekávané výstupní soubory, které očekáváte. Nezapomeňte pokrýt všechny případy použití, např. zda jsou všechny shody proti hodnotám v 1 sloupci nebo různým shodám v různých sloupcích atd. Viz Jak se zeptat .

Odpověď

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

Zní to jako to, o co se opravdu snažíte, je vytvořit nový soubor za ID, který za předpokladu, že ID jsou jedinečná jako ve vašem příkladu, by byl:

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

nebo pokud chcete, aby každý výstupní soubor obsahoval záhlaví:

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

Komentáře

  • Upravil jsem to kvůli jasnosti, ale opravdu chci pouze 1 soubor obsahující ty Vzhledem k enormní povaze dat jsem se pokusil vytvořit ukázkovou sadu pro demonstrační účely, ale programování jsem ' nový, takže jsem ' nejsem si jistý, jestli ' m správně vyjadřuji to, co potřebuji.

Odpovědět

Pro každého, kdo to může najít ve fu ture, mám řešení. První věc, kterou jsem udělal, bylo převést TSV na CSV pomocí:

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

Poté prohledat můj kód souboru, který jsem hledal, je:

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

Tímto způsobem se v prvním sloupci vyhledá text obsažený v samostatném souboru CSV. V tomto případě je " file1 " soubor, který chcete vyhledat, a " file2 " obsahuje vyhledávací řetězce. Oba tyto soubory mají formát CSV.

Tím se vytvořil samostatný soubor CSV, který obsahoval všechny řádky v souboru1, který měl ve sloupci 1 určité ID, které odpovídá jednomu z ID obsažených v souboru2.

Doufám, že to pomůže jednoho dne někdo, protože tohle už několik týdnů otřáslo mým mozkem. Sám jsem řešení ani nedostal, můj šéf mi to musel ukázat.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *