Modo Unix di filtraggio / mappatura / mappatura dei record tramite la pipeline?

0

A casa uso Linux e ho più di un decennio. Al lavoro usiamo Windows e quindi trovo PowerShell più familiare. Sono un fan di Linux / Unix a cuore, ma ho avuto un successo maggiore con la pipeline PowerShell. Il modello degli oggetti pipelining è utile perché quando arriva proprio ad esso, nell'elaborazione dei dati spesso elaboriamo entità (cose che hanno coppie chiave / valore, cioè attributi).

Chiaramente questo è qualcosa che Unix ha fatto per sempre. Sospetto che strumenti come sed e awk possano svolgere un ruolo, ma per me sono meno intuitivi. In Unix stai convogliando il testo grezzo attraverso il flusso. Se si desidera eseguire il piping delle operazioni sulla rubrica personale, è necessario innanzitutto considerare quanto sia conduttivo il formato dei dati in arrivo per l'elaborazione della pipeline. Sospetto che un record apparirebbe su una singola riga. Non so se esiste un formato / protocollo dati favorito dalla comunità per scrivere record facilmente interconnessi tra i programmi Unix. Ovviamente, il formato determina quali programmi si utilizzano e come li si utilizza (ad esempio come filtri, mappa e mapcat).

In PowerShell:

$input | ? { $_["contact_type"] -eq "Professional" } ;filtering
$input | % { $_["state_code"].ToUpperCase() }        ;mapping
$input | % { $_["phone_numbers"] -split ";" }        ;mapcatting
$input | % { $_["contact_type"] = "Friend"  }        ;mutating an attribute

;or when preferring to avoid mutation of the source data
$input | % { $h = $_.Clone(); $h["Surname"] = $_["Surname"].ToLower(); $h} 

Sono sicuro che potrei passare la giornata a capire come potrei realizzarlo in Unix, ma sono interessato a qualcosa che sia idiomatico e uguale alla leggibilità di PowerShell. La scelta del formato dati corretto (CSV, XML, ecc.) Influisce sulla leggibilità della nostra logica di pipeline. Sarebbe imbarazzante se la logica mantenesse intatta l'astrazione della linea di testo. Preferirei un'astrazione in cui la logica apporti maggiore attenzione alle chiavi e ai valori (ossia la sensazione di "oggetti") rispetto alle righe di testo.

In Unix, se potessi memorizzare i dati dei tuoi record in qualsiasi formato, quale formato sceglieresti per facilitare l'elaborazione della pipeline chiara e concisa? Le controparti di Bash per gli esempi precedenti sarebbero apprezzate.

    
posta Mario T. Lanza 01.04.2015 - 17:12
fonte

1 risposta

1

Quando bash e core util non sono abbastanza, mi rivolgo a Perl. È possibile memorizzare i dati in un file di testo, in XML, CSV, database reale o sono disponibili diversi moduli di serializzazione.

Una volta che i tuoi contatti sono in un array, puoi facilmente applicare tutte le operazioni (non conosco PowerShell, quindi potrebbero non essere esattamente equivalenti):

my @professionals = grep 'Professional' eq $_->{contanct_type}, @contacts;
my @upper         = map uc $_->{state_code}, @contacts;
my @numbers       = map { split /;/, $_->{phone_numbers} } @contacts;
$_->{contact_type} = 'Friend' for @contacts;

Lo stesso vale per Python o Ruby.

    
risposta data 01.04.2015 - 17:38
fonte

Leggi altre domande sui tag