Puncte:0

fuzionarea fișierelor txt delimitate de file pe baza coloanei (care este antetul) în bash?

drapel us

Am două fișiere text care conțin milioane de înregistrări, toate înregistrările sunt delimitate de tabulatori, cum putem îmbina aceste două fișiere pe baza aceluiași antet (coloană)?

fisier:1

    LogEntryTime nameId PartnerId        
    2021-06-05T15:00:53 07 5lsddf qyutxwr 
        
        

dosar:2

        nameId GroupId compnayId
        5lsddf l4buafm 0rd33cs               
    

ieșire astfel:

    LogEntryTime nameId PartnerId GroupId compnayId
    2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

Am încercat asta dar nu funcționează:

lipiți fișierul1.txt fișierul2.txt | nameId -s $'\t' -t

și

pisica fișier1.txt fișier2.txt | awk -F '\t' '{printează $ listă aici numele tuturor coloanelor}'

awk unul care funcționează, dar trebuie să menționați toate numerele coloanelor acolo.

exista vreo alta solutie sa ma ajute.

mulțumesc anticipat

vanadium avatar
drapel cn
Probabil că aș folosi o bază de date pentru asta.
Vamshi Krishna CH avatar
drapel us
în scriptul shell cum putem realiza asta?
vanadium avatar
drapel cn
Nu cred că va fi ușor. Multe bucle și va fi lent.
Vamshi Krishna CH avatar
drapel us
pentru sute de înregistrări folosiți și aceeași procedură?
vanadium avatar
drapel cn
Dacă ordinea înregistrărilor este identică în toate fișierele text (adică înregistrarea 2 din fișierul 1 maches înregistrarea 2 din fișierul 2 etc), atunci comanda ta awk cu paste o va tăia. Mai bine adaugă aceste informații la întrebarea ta. Am presupus că datele trebuie să fie potrivite, de exemplu, `nameid 5lsddf` este înregistrarea 1 în fișierul 1, dar înregistrarea *x* în fișierul 2.
Vamshi Krishna CH avatar
drapel us
aceeași coloană va tăia în al doilea fișier fuzionare cu primul fișier. asta e tot
Vamshi Krishna CH avatar
drapel us
poti ajuta la asta?
Puncte:2
drapel hr

Dacă fișierele dvs. sunt fișiere separate prin file (TSV) construite corect, atunci puteți utiliza csvjoin de la baza Python csvkit pachet.

Ex. dat:

$ head file1.tsv file2.tsv | pisica -A
==> fișier1.tsv <==$
LogEntryTime^InameId^IPartnerId$
2021-06-05T15:00:53 07^I5lsddf^Iqyutxwr$
$
==> fișier2.tsv <==$
nameId^IGroupId^IcompnayId$
5lsddf^Il4buafm^I0rd33cs$

(pisica -A pentru a face vizibile filele, ca ^I) atunci

$ csvjoin -I -t -c nameId file1.tsv file2.tsv
LogEntryTime,nameId,PartnerId,GroupId,compnayId
2021-06-05T15:00:53 07,5lsddf,qyutxwr,l4buafm,0rd33cs

Pentru a obține rezultatul înapoi în format TSV, utilizați csvformat din acelasi pachet:

$ csvjoin -I -t -c nameId fișier1.tsv fișier2.tsv | csvformat -T
LogEntryTime nameId PartnerId GroupId compnayId
2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

Rețineți că -Eu dezactivează inferența de tip - care se poate comporta uneori în mod neașteptat, în special cu câmpurile datetime.


Și mai simplu, folosind Miller (disponibil din depozitul universului, ca pachet morar):

$ mlr --tsv join -f file1.tsv -j nameId apoi reordonează -f LogEntryTime file2.tsv
LogEntryTime nameId PartnerId GroupId compnayId
2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

The reordonează este necesar deoarece implicit mlr join scoate mai întâi câmpul comun (la fel ca sistemul a te alatura comanda). Rețineți că pentru intrare nesortată, întregul fișier1.tsv va fi încărcat în memorie.

Puncte:2
drapel cn

Buclă unul dintre fișiere într-o matrice și înlocuiți primul câmp al celui de-al doilea fișier (care este nameId) cu indicele de matrice care se corelează cu câmpul comun.

awk -F \t+ -vOFS=\t 'NR==FNR{a[$2]=$0;next} {$1=a[$1]}1' fișier{1,2}.txt
Puncte:1
drapel cn

Cu acest set special de date:

awk'
    ÎNCEPE {FS = OFS = „\t”}
    NR == FNR {f1[$2] = $0; Următorul}
    {$1 = f1[$1]; imprimare}
' fișier{1,2}.txt

Este menționat doar câmpul de alăturare ($2 în fișierul 1, $1 în fișierul 2).

Produce ieșire separată de tabulatori

LogEntryTime nameId PartnerId GroupId compnayId
2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

Pentru o ieșire destul de bună, introduceți | coloana -t -s $'\t' a obține

LogEntryTime nameId PartnerId GroupId compnayId
2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.