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
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.
awk -F '\t'
oddělí vstupní pole podle karet. Ve skutečnostiawk
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 }'
.$3 = "Blue"
by měl být$3 == "Blue"
. První je úkolem, druhé je porovnáním.