CSV-adatok használata az awk

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

  • Miért nem csak elemezni közvetlenül a TSV? A awk -F '\t' fülekkel különíti el a beviteli mezőket. És valóban, alapértelmezés szerint a awk ö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) csak awk -F '\t' 'BEGIN { OFS="\t" } NR==1 { print } NR>1 && $3 = "Blue" { print }' kell.
  • Megpróbáltam futtatni ezt a parancsot egy " test.tsv ", a fent felsoroltakkal megegyező bemenettel, azonban szokatlan kimenetet produkált. Csak az összes szemszínt lecserélte " kékre ", miközben minden más a régiben maradt.
  • $3 = "Blue" $3 == "Blue" értéknek kell lennie. Az előbbi egy hozzárendelés, az utóbbi összehasonlítás.
  • CSV vagy TSV ez?
  • Az Ön igényeire vonatkozó információk kiosztása egyszerre csak morzsa nem ' jó megközelítés a jó megoldás megszerzéséhez. Kérjük, szerkessze a kérdését, hogy valóban reprezentatívabb példát adjon arra, hogy mit is akar csinálni '. Adjon meg egy TSV fájlt, egy CSV fájlt és a várható kimeneti fájlokat, amelyekre az adott esetben számít. Ügyeljen arra, hogy minden felhasználási esetét lefedje, pl. hogy az összes egyezés 1 oszlopban szereplő értékekkel vagy a különböző oszlopokban más-más egyezéssel áll-e szemben, lásd: Hogyan kérdezzek .

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.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük