Kommandolinjetricks til datavidenskabsmænd

For mange dataforskere begynder datamanipulationen og slutter med Pandas eller Tidyverse. I teorien er der intet galt med denne opfattelse. Det er trods alt, hvorfor disse værktøjer findes i første omgang. Alligevel kan disse indstillinger ofte være overdrevne til enkle opgaver.

At stræbe efter at beherske kommandolinjen skal være på enhver udviklers liste, især dataforskere. At lære ind og outs på din terminal vil ubestrideligt gøre dig mere produktiv. Ud over det fungerer kommandolinjen som en stor historikundervisning i computing. For eksempel awk - et datadrevet scriptingsprog. Awk optrådte først i 1977 ved hjælp af Brian Kernighan, K i den legendariske K&R-bog. I dag, nogle næsten 50 år senere, forbliver awk relevant med nye bøger, der stadig vises hvert år! Det er således sikkert at antage, at investering i en lille kommandolinjegruppe ikke afskrives på et hvilket som helst tidspunkt snart.

Hvad vi skal dække

  • ICONV
  • HOVED
  • TR
  • Toilet
  • DELE
  • SORT & UNIQ
  • SKÆRE
  • SÆT IND
  • TILSLUTTE
  • GREP
  • SED
  • AWK

ICONV

Filkodninger kan være vanskelige. For det meste er filer i disse dage alle UTF-8 kodet. For at forstå nogle af magien bag UTF-8, tjek denne fremragende video. Ikke desto mindre er der tidspunkter, hvor vi modtager en fil, der ikke er i dette format. Dette kan føre til nogle vanvittige forsøg på at bytte kodningsskemaet. Her er iconv en livredder. Iconv er et simpelt program, der tager tekst i en kodning og udsender teksten i et andet.

# Konvertering -f (fra) latin1 (ISO-8859-1)
# -t (til) standard UTF_8
iconv -f ISO-8859-1 -t UTF-8  output.txt

Nyttige indstillinger:

  • iconv - l viser alle kendte kodninger
  • iconv -c kasser lydløst tegn, der ikke kan konverteres

HOVED

Hvis du er en hyppig Pandas-bruger, bliver hovedet kendt. Når vi håndterer nye data, er det første, vi gerne vil gøre, en fornemmelse af, hvad der findes. Dette fører til fyring af Pandas, læsning af dataene og derefter kalde df.head () - anstrengende, for at sige det mildt. Hoved, uden flag, udskriver de første 10 linjer i en fil. Hovedets sande kraft ligger i at teste rengøringsoperationer. For eksempel, hvis vi ville ændre afgrænsningen af ​​en fil fra komma til rør. En hurtig test ville være: head mydata.csv | sed 's /, / | / g'.

# Udskriver de første 10 linjer
head filename.csv
# Udskriv de første 3 linjer
head -n 3 filename.csv

Nyttige indstillinger:

  • head -n udskriv et specifikt antal linjer
  • head -c udskrive et specifikt antal bytes

TR

Tr er analog til at oversætte. Dette kraftfulde værktøj er en arbejdshest til grundlæggende filrengøring. En ideel brugssag er til at udskifte afgrænsere i en fil.

# Konvertering af en fanebegrænset fil til kommaer
cat tab_delimited.txt | tr "\\ t" ","> comma_delimited.csv

En anden funktion ved tr er alle de indbyggede [: klasse:] variabler til din rådighed. Disse inkluderer:

[: alnum:] alle bogstaver og cifre
[: alpha:] alle bogstaver
[: blank:] alt vandret hvidafstand
[: cntrl:] alle kontroltegn
[: ciffer:] alle cifre
[: graf:] alle udskrivbare tegn, ikke med plads
[: lavere:] alle små bogstaver
[: print:] alle udskrivbare tegn, inklusive plads
[: punktum:] alle tegnsætningstegn
[: mellemrum:] alt vandret eller lodret hvidrum
[: store:] alle store bogstaver
[: xdigit:] alle hexadecimale cifre

Du kan kæde en række af disse sammen for at komponere kraftfulde programmer. Følgende er et grundlæggende ordtællingsprogram, du kan bruge til at kontrollere dine README'er for overforbrug.

kat README.md | tr "[: punct:] [: space:]" "\ n" | tr "[: øvre:]" "[: nedre:]" | grep. | sorter | uniq -c | sortere -nr

Et andet eksempel ved hjælp af grundlæggende regex:

# Konvertering af alle store bogstaver til små bogstaver
cat filename.csv | tr '[A-Z]' '[a-z]'

Nyttige indstillinger:

  • tr -d slette tegn
  • tr-s klemmer tegn
  • \ b backspace
  • \ f form feed
  • \ v lodret fane
  • \ NNN-tegn med oktal værdi NNN

Toilet

Ordtælling. Dets værdi er primært afledt af -l-flagget, som giver dig linietællingen.

# Returnerer antal linjer i CSV
wc -l gigantic_comma.csv

Dette værktøj er praktisk til at bekræfte output fra forskellige kommandoer. Så hvis vi skulle konvertere afgrænsningerne i en fil og derefter køre wc -l, ville vi forvente, at de samlede linjer var de samme. Hvis ikke, ved vi, at noget gik galt.

Nyttige indstillinger:

  • wc -c udskriv bytællinger
  • wc -m udskriv tegnet tæller
  • wc -L udskrivningslængde på den længste linje
  • wc -w trykte ord tæller

DELE

Filstørrelser kan variere dramatisk. Og afhængigt af jobbet, kan det være fordelagtigt at opdele filen - således splittes. Den grundlæggende syntaks for split er:

# Vi deler vores CSV i nyt_filnavn hver 500 linjer
split -l 500 filename.csv new_filename_
# filename.csv
# ls output
# nyt_filnavn_aaa
# nyt_filnavn_aab
# nyt_filnavn_aac

To underlige bemærkninger er navnekonventionen og manglen på filtypenavne. Suffiks-konventionen kan være numerisk via -d-flag. For at tilføje filtypenavn skal du køre følgende find-kommando. Det vil ændre navnene på ALLE filer i det aktuelle bibliotek ved at tilføje .csv, så vær forsigtig.

Find . -type f -exec mv '{}' '{}'. csv \;
# ls output
# filename.csv.csv
# new_filename_aaa.csv
# new_filename_aab.csv
# new_filename_aac.csv

Nyttige indstillinger:

  • split -b opdelt efter bestemt byte-størrelse
  • split -a generere suffikser af længde N
  • split -x split ved hjælp af hex suffikser

SORT & UNIQ

De foregående kommandoer er indlysende: de gør, hvad de siger, de gør. Disse to giver den mest slag i tandem (dvs. unikke ordtællinger). Dette skyldes uniq, der kun fungerer på duplikerede tilstødende linjer. Derfor er grunden til at sortere, før output gennemføres. En interessant note er, at sortering -u vil opnå de samme resultater som den typiske sorteringsfil.txt | unikt mønster.

Sortering har en lumsk nyttig evne for dataforskere: muligheden for at sortere en hel CSV baseret på en bestemt kolonne.

# Sortering af en CSV-fil efter den anden kolonne alfabetisk
sorter -t, -k2 filename.csv
# Numerisk
sorter -t, -k2n filnavn.csv
# Omvendt rækkefølge
sorter -t, -k2nr filnavn.csv

Muligheden -t her er at specificere kommaet som vores afgrænser. Oftere antages der ikke mellemrum eller faner. Desuden er -k-flaget til at specificere vores nøgle.

Nyttige indstillinger:

  • sorter -F ignorere sag
  • sorter -r omvendt sorteringsrækkefølge
  • sorter-R scramble rækkefølge
  • uniq -c tæller antal forekomster
  • uniq - skriv kun duplikatlinjer

SKÆRE

Klip er til at fjerne kolonner. For at illustrere, hvis vi kun ville have den første og den tredje kolonne.

klip -d, -f 1,3 filnavn.csv

For at vælge hver anden kolonne end den første.

klippe -d, -f 2- filename.csv

I kombination med andre kommandoer fungerer klipning som et filter.

# Udskriv de første 10 linjer i kolonne 1 og 3, hvor "nogle_streng_værdi" er til stede
head filename.csv | grep "some_string_value" | skåret -d, -f 1,3

Find ud af antallet af unikke værdier i den anden kolonne.

cat filename.csv | skåret -d, -f 2 | sorter | uniq | wc -l
# Tæl forekomster af unikke værdier, begrænser til de første 10 resultater
cat filename.csv | skåret -d, -f 2 | sorter | uniq -c | hoved

SÆT IND

Indsæt er en nichekommando med en interessant funktion. Hvis du har to filer, som du har brug for, og de allerede er sorteret, har du indsat indsæt.

# names.txt
adam
John
zach
# jobs.txt
jurist
YouTuber
Udvikler
# Slut de to til en CSV
indsæt -d ',' navn.txt jobs.txt> person_data.txt
# Output
adam, advokat
John, youtuber
zach, udvikler

For en mere SQL-esque variant, se nedenfor.

TILSLUTTE

Deltag er en forenklet, kvasi-tangentiel, SQL. De største forskelle er, at joinwill returnerer alle kolonner og kampe kan kun være på et felt. Som standard vil join forsøge at bruge den første kolonne som matchningsnøgle. For et andet resultat er følgende syntaks nødvendig:

# Deltag i den første fil (-1) i den anden kolonne
# og den anden fil (-2) med den første
slutte -t, -1 2 -2 1 first_file.txt second_file.txt

Standardforbindelsen er en indre sammenføjning. Imidlertid er en ydre sammenføjning også levedygtig gennem et-flag. Et andet bemærkelsesværdigt udfald er -e-flaget, som kan bruges til at erstatte en værdi, hvis der mangler et felt der mangler.

# Udvendig sammenføjning, udskift emner med NULL i kolonne 1 og 2
# -o hvilke felter der skal erstattes - 0 er nøglen, 1.1 er første kolonne osv. ...
gå sammen -t, -1 2 -a 1 -a2 -e 'NULL' -o '0,1.1,2.2' first_file.txt second_file.txt

Ikke den mest brugervenlige kommando, men desperate tider, desperate foranstaltninger.

Nyttige indstillinger:

  • sammenføjning -en udskriv uparbare linjer
  • slutte -e erstatte manglende inputfelter
  • sammenføjning -j svarer til -1 FIELD -2 FIELD

GREP

Global søgning efter et regelmæssigt udtryk og tryk eller grep; sandsynligvis den mest kendte kommando og med god grund. Grep har meget magt, især til at finde vej rundt i store codebaser. Inden for datavidenskab fungerer det som en raffineringsmekanisme for andre kommandoer. Selvom dens standardforbrug også er værdifuld.

# Rekursivt søgning og liste alle filer i biblioteket der indeholder 'ord'
grep -lr 'ord'.
# Liste antal filer der indeholder ord
grep -lr 'ord'. | wc -l

Tæll det samlede antal linjer, der indeholder ord / mønster.

grep -c 'some_value' filnavn.csv
# Samme ting, men i alle filer i det aktuelle bibliotek efter filnavn
grep -c 'some_value' *

Grep for flere værdier ved hjælp af operatoren eller \ -.

grep "first_value \ | second_value" filename.csv

Nyttige indstillinger

  • alias grep = "grep - farve = auto" gør grep farverig
  • grep -E brug udvidede regexps
  • grep -w matcher kun hele ord
  • grep -l udskriv navn på filer med match
  • grep -v inverteret matching

DE STORE våben

Sed og Awk er de to mest kraftfulde kommandoer i denne artikel. For kortfattethed vil jeg ikke gå i udtømmende detaljer om nogen af ​​dem. I stedet vil jeg dække en række kommandoer, der beviser deres imponerende magt. Hvis du vil vide mere, er der en bog bare til det.

SED

I sin kerne er sed en streameditor, der fungerer line-for-line-basis. Det udmærker sig ved substitutioner, men kan også udnyttes til alle refactoring.

Den mest basale sed-kommando består af s / gammel / ny / g. Dette oversættes til at søge efter gammel værdi, erstatte alle forekomster på linje med nye. Uden / g ville vores kommando afslutte efter den første forekomst på linjen.

For at få en hurtig smag af kraften lader du dykke i et eksempel. I dette scenarie har du fået følgende fil:

balance, navn
$ 1.000, john
$ 2.000, donkraft

Den første ting, vi måske ønsker at gøre, er at fjerne dollartegnene. -I-flag viser på stedet. '' Er for at indikere en nul-længde filtypenavn, hvilket overskriver vores oprindelige fil. Ideelt set ville du teste hver af disse individuelt og derefter udsende til en ny fil.

sed -i '' s / \ $ // g 'data.txt
# balance, navn
# 1.000, john
# 2.000, jack

Herefter kommer kommaerne i vores balancekolonneværdier.

sed -i '' 's / \ ([0-9] \), \ ([0-9] \) / \ 1 \ 2 / g' data.txt
# balance, navn
# 1000, john
# 2000, donkraft

Til sidst, Jack op og besluttede at afslutte en dag. Så au revoir, mon ami.

sed -i '' '/ jack / d' data.txt
# balance, navn
# 1000, john

Som du kan se, pakker sed ganske stempel, men det sjove stopper ikke der.

AWK

Det bedste til sidst. Awk er meget mere end en simpel kommando: det er et fuldt sprog. Af alt, der er dækket af denne artikel, er awk langt den fedeste. Hvis du finder dig selv imponeret, er der masser af gode ressourcer - se her, her og her.

Almindelige brugssager for awk inkluderer:

  • Tekstbehandling
  • Formaterede tekstrapporter
  • Udførelse af aritmetiske operationer
  • Udfører strenghandlinger

Awk kan parallelle grep i sin mest begynnende form.

awk '/ word /' filnavn.csv

Eller med lidt mere magi kombinationen af ​​grep og cut. Her udskriver awk den tredje og fjerde kolonne, fanen adskilt, for alle linjer med vores ord. -F, ændrer blot vores afgrænser til et komma.

awk -F, '/ word / {print $ 3 "\ t" $ 4}' filename.csv

Awk leveres med en masse nifty variabler indbygget. For eksempel NF - antal felter - og NR - antal poster. Sådan får du den halvtreds tredjedelrekord i en fil:

awk -F, 'NR == 53' filnavn.csv

En ekstra rynke er muligheden for at filtrere baseret på en eller flere værdier. Det første eksempel nedenfor, udskriver linjenummer og kolonner for poster, hvor den første kolonne er lig med streng.

awk -F, '$ 1 == "string" {print NR, $ 0}' filename.csv
# Filter baseret på den numeriske værdi i anden kolonne
awk -F, '$ 2 == 1000 {print NR, $ 0}' filename.csv

Flere numeriske udtryk:

# Udskriv linjenummer og kolonner, hvor kolonne tre er større
# end 2005 og kolonne fem under tusind
awk -F, '$ 3> = 2005 && $ 5 <= 1000 {print NR, $ 0}' filnavn.csv

Sum den tredje kolonne:

awk -F, '{x + = $ 3} END {print x}' filnavn.csv

Summen af ​​den tredje kolonne for værdier, hvor den første kolonne er lig med "noget".

awk -F, '$ 1 == "noget" {x + = $ 3} END {print x}' filnavn.csv

Hent dimensionerne på en fil:

awk -F, 'END {print NF, NR}' filename.csv
# Smukkere version
awk -F, 'BEGIN {udskriv "COLUMNS", "ROWS"}; END {print NF, NR} 'filnavn.csv

Udskriv linjer, der vises to gange:

awk -F, '++ set [$ 0] == 2' filename.csv

Fjern duplikatlinjer:

# På hinanden følgende linjer
awk 'a! ~ $ 0; {A = $ 0} ']
# Ikke-sammenhængende linjer
awk '! a [$ 0] ++ 'filnavn.csv
# Mere effektivt
awk '! ($ 0 i a) {a [$ 0]; print}

Udskift flere værdier ved hjælp af indbygget funktion gsub ().

awk '{gsub (/ scarlet | rubin | puce /, "rød"); Print}'

Denne awk-kommando vil kombinere flere CSV-filer, ignorere overskriften og derefter tilføje den i slutningen.

awk 'FNR == 1 && NR! = 1 {næste;} {print}' * .csv> final_file.csv

Brug for at formindske en massiv fil? Welp, awk kan håndtere det med hjælp fra sed. Konkret bryder denne kommando en stor fil i flere mindre, baseret på en linjetælling. Denne one-liner tilføjer også en udvidelse.

sed '1d; $ d' filnavn.csv | awk 'NR% NUMBER_OF_LINES == 1 {x = "filnavn -" ++ i ".csv";} {print> x}'
# Eksempel: opdele big_data.csv i data_ (n) .csv hver 100.000 linjer
sed '1d; $ d' big_data.csv | awk 'NR% 100000 == 1 {x = "data _" ++ i ".csv";} {print> x}'

LUKNING

Kommandolinjen kan prale af uendelig kraft. Kommandoerne, der er omfattet af denne artikel, er nok til at løfte dig fra nul til helt på kort tid. Ud over dem, der er omfattet, er der mange værktøjer, der skal overvejes til daglige datafunktioner. Csvkit, xsv og q er tre bemærkninger. Hvis du ønsker at tage et endnu dybere dybde i kommandolinjedatavidenskaben, skal du ikke lede længere end denne bog. Det er også tilgængeligt online gratis!

Mere på min blog!

LINKS

  • Sed One-Liners
  • Awk One-Liners
  • Arbejde med CSV'er på kommandolinjen
  • Tilføjelse af filtypenavne
  • Mine bedste AWK-tricks
  • Bioinformatik en-liners
  • UNIX-skolen
  • Sed - En introduktion og en tutorial