segítségével megpróbálom megtalálni a módját, hogy az egyes adatokat vegyem egy CSV-fájlból, és a grepen belüli változóként használjam, vagy awk parancs. Bármelyik megfelelőnek tűnik, de nem tudom, hogyan mondjam meg neki, hogy ezt megfelelően tegye.
Például van egy TSV formátumú adatkészletem, amely így néz ki:
ID Name Eye Color 1 Bill Blue 2 Sam Blue 3 Fred Brown 4 Joe Brown 5 Ted Blue 6 Bob Brown
Ez nem a tényleges adatkészlet, hanem ugyanúgy viselkedik. Ez a teljes fehérje-kötési adatbázis, a TSV 300 MB, millió bejegyzéssel és tucatnyi oszloppal, így nem tudok tisztán tartalmazza az igazit.
A sorokat tartalmazó fájlt szeretnék készíteni olyan személyekkel, akiknek kék a szeme, ezért létrehoztam egy CSV fájlt, amely a " ID " oszlop, amely ebben az esetben így néz ki:
1, 2, 5
Ez a CSV " ID " a " Grep " parancs a kulcs kifejezés keresésére.
Végül egy ilyen TSV fájlt szeretnék: 1 Bill Blue 2 Sam Blue 5 Ted Blue
De nem tűnhet kitalálni hogyan kell csinálni. Minden egyes bejegyzéshez egyedileg hozhatom létre az awk vagy a grep használatával, és az azonosító számot is feltüntetem kritériumként, azonban a CSV I “m használatával 1200 bejegyzés van, ezért szeretném automatizálni ezt a folyamatot.
Az alábbiakban kód található ez meghozza a kívánt eredményt egyetlen bejegyzésnél, de az azonosító számokat szeretném használni az automatikus kereséshez.
A BindindDB_All.tsv az én forrásfájlom, több millió bejegyzéssel. Ez létrehoz egy TSV nevet. " new.tsv " és tartalmazza a BindindDB_All.tsv fájl teljes sorát, ahol az azonosító (az 1. oszlopban) 66106.
awk "$1 == 66106" BindingDB_All.tsv >> new.tsv
Ilyeneket szeretnék csinálni:
awk "$1 == ID.csv" BindingDB_All.tsv >> new.csv
ahol olvasható lenne mindegyik azonosítót, nyomtassa ki a sort az új.csv fájlra, majd olvassa el a következő azonosítót, és tegye ugyanezt.
A CSV-fájl 1200 keresési kifejezést tartalmaz, összehasonlítva a több millió egyedi azonosítóval rendelkező lehetőséggel. csak CSAK az 1. oszlopban kell keresni, mivel az az azonosítót megtalálja a többi változóban minden sorban.
Összefoglalásképpen szükségem van rá, hogy a sor 1. oszlopába nézzek, összehasonlítsam a CSV-fájlom első számával, és lássam, ez egyezés-e. Ha ez nem egyezés, akkor ellenőriznie kell az 1. oszlop következő sorát, és így tovább, amíg meg nem találja a mérkőzést. Amikor megtalálja azt a sort, ahol az 1. oszlop megegyezik a CSV első adatpontjával, azt akarom, hogy adja ki a sort. Aztán azt akarom, hogy a CSV második bejegyzésénél ismételje meg, amíg meg nem találja az összes 1200 sort.
Van ötlet? Ez hurokproblémának hangzik, de azt sem tudom, hogyan lehetne ezt működtetni.
SZERKESZTÉS:
Mivel az emberek továbbra is hajlandóak segíteni, hadd próbáljak válaszolni a kérdésekre amelyeket elküldtem.
Itt vannak a valós adataim első 6 bejegyzése, amelyek azonosító számokat tartalmaznak, amelyeket keresési paraméterként fognak használni.
66106 66107 66108 66109 66110 50127715
Nincsenek oszlopnevek, nincsenek egyéb adatok. Ezek azok az értékek, amelyeket külön-külön szeretnék keresni egy másik fájlban, egy TSV-ben. A TSV méretét illetően is tévesen állítottam fel, van egy 4 GB-os TSV-m, amely a következőre tömörül: 300 MB. A fájl több bejegyzést tartalmaz, mint amennyit egyetlen programom sem enged meg még megtekinteni. Az alábbiakban bemutatunk egy példát a több millióból álló egyetlen bejegyzésre. Szükségem van rá, hogy az összes adatot egyszerre lehívjam, így a vágás nem egy opció.
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-metil-2- (1-propilbutil) – (6aR, 9aS) -3,4,5,8-tetrahidrociklopenta [4,5] imidazo [2,1-b] purin-4- egy :: CHEMBL280307 Foszfodiészteráz 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, 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 44.272.162 103.967.010 CHEMBL280307 ZINC28221715 1 MGSTATETEELENTTFKYLIGEQTEKMWQRLKGILRCLVKQLEKGDVNVIDLKKNIEYAASVLEAVYIDETRRLLDTDDELSDIQSDSVPSEVRDWLASTFTRKMGMMKKKSEEKPRFRSIVHVVQAGIFVERMYRKSYHMVGLAYPEAVIVTLKDVDKWSFDVFALNEASGEHSLKFMIYELFTRYDLINRFKIPVSCLIAFAEALEVGYSKYKNPYHNLIHAADVTQTVHYIMLHTGIMHWLTELEILAMVFAAAIHDYEHTGTTNNFHIQTRSDVAILYNDRSVLENHHVSAAYRLMQEEEMNVLINLSKDDWRDLRNLVIEMVLSTDMSGHFQQIKNIRNSLQQPEGLDKAKTMSLILHAADISHPAKSWKLHHRWTMALMEEFFLQGDKEAELGLPFSPLCDRKSTMVAQSQIGFIDFIVEPTFSLLTDSTEKIIIPLIEEDSKTKTPSYGASRRSNMKGTTNDGTYSPDYSLASVDLKSFKNSLVDIIQQNKERWKELAAQGEPDPHKNSDLVNAEEKHAETHS kalcium / kalmodulin-dependens 3″ , 5″ -ciklusos nukleotid-foszf odiészteráz 1A PDE1A_BOVIN P14100 Q08E30, Q28063
Nem tudom, hogyan lehet ezt TSV-ként olvasni ebben a mezőben, de az 50127715 az első oszlop, az ID oszlop. Szeretném, ha a kezdeti CSV fájlom, amely tartalmazza az érdeklődő azonosító számokat, az első oszlopban egyenként keressen egy azonosító számot a nagy TSV fájlban. Ha a szám az első oszlopban található, akkor azt akarom, hogy írja be ezt a sort egy fájlba, majd keresse meg a következő azonosítót. Az összes eredményt egyetlen fájlban szeretném megírni.
Biztos vagyok benne, hogy minden lépésem során könnyebben elérhetem az idejutást, de egyértelműen nem vagyok biztos abban, hogyan készítsem el. ez világosabb. Azt akarom, hogy a nagy TSV-ben megkeresse a " 66106 " -t az 1. oszlopon belül, és amikor megtalálja azt a sort, ahová a teljes sort írja Fájl. Ezután keressen rá a " 66107 " kifejezésre, és miután megtalálta, hozzáadja ugyanahhoz a fájlhoz. Így egyetlen fájlom van, CSV vagy TSV lehet, több millió helyett 1200 bejegyzéssel.
Megjegyzések
Válasz
$ awk -F"\t" "(NR==1) || ($3=="Blue")" file ID Name Eye Color 1 Bill Blue 2 Sam Blue 5 Ted Blue
Úgy hangzik, hogy bármi, amit valóban megpróbálsz megtenni, új dolgot hoz létre fájl azonosítónként, amely feltételezve, hogy az azonosítók egyediak, mint a példában, a következők lehetnek:
awk -F"\t" "{ out="out_" $1 ".txt"; print > out; close(out) }" BindingDB_All.tsv
vagy ha azt szeretné, hogy minden kimeneti fájl tartalmazza a fejlécet:
awk -F"\t" " NR==1 { hdr=$0; next } { out="out_" $1 ".txt"; print hdr ORS $0 > out; close(out) } " BindingDB_All.tsv
Megjegyzések
- Az érthetőség kedvéért szerkesztettem, de valóban csak 1 fájlt szeretnék, amelyek ezeket tartalmazzák nevek. Az adatok óriási jellege miatt csak egy példakészletet próbáltam készíteni demonstrációs célokra, de ' új vagyok a programozásban, ezért ' nem vagyok benne biztos, hogy ' megfelelően fejezem-e ki, amire szükségem van.
Válasz
Mindenkinek, aki ezt megtalálhatja a fu-ban van megoldásom. Először a TSV-t konvertáltam CSV-vé a következő használatával:
sed "s/\t/,/g" filename_with_tabs > filename_with_commas.csv
Majd a keresett fájlkódomban keresgéltem:
awk -F, "FNR==NR {h[$1] = $0; next} {print $0,h[$1]}" file1 file2 > new_file.csv
Ez az első oszlopban keresi a külön CSV-ben található szöveget. Ebben az esetben a " fájl1 " a keresendő fájl, és a " fájl2 " tartalmazza a keresendő karakterláncokat. Mindkét fájl CSV formátumú.
Ez egy külön CSV fájlt hozott létre, amely tartalmazta az 1. fájl összes sorát, amelynek az 1. oszlopában volt egy bizonyos azonosító, amely megegyezik a 2. fájl egyik azonosítójával.
Remélem, hogy ez segít valaki egyszer, mert ez hetekig roncsolta az agyam. Magam sem kaptam meg a megoldást, a főnökömnek meg kellett mutatnia nekem.
awk -F '\t'
fülekkel különíti el a beviteli mezőket. És valóban, alapértelmezés szerint aawk
összefüggő szóközökkel fogja elválasztani a mezőket. Tehát az összes kék szemű ember megszerzéséhez (és a fejléc megőrzéséhez) csakawk -F '\t' 'BEGIN { OFS="\t" } NR==1 { print } NR>1 && $3 = "Blue" { print }'
kell.$3 = "Blue"
$3 == "Blue"
értéknek kell lennie. Az előbbi egy hozzárendelés, az utóbbi összehasonlítás.