2015-04-07 9 views

risposta

11

Su un Mac, BSD sed richiede il suffisso per il backup (ma il suffisso può essere una stringa vuota, '') - non è facoltativa in quanto è con GNU sed. Quindi, il tuo comando viene interpretato come "backup del file con il suffisso 2d e ... oops, lo script che hai dato è file.csv, ma f non è un comando sed".

sed -i .bak -e 2d file.csv 

Elimina la prima riga di dati dal file CSV (lasciando la riga di intestazione in posizione).

Se si vuole scrivere il codice in modo che funziona sia con BSD e GNU sed, allora dovete collegare il suffisso all'opzione -i (GNU sed richiede il suffisso allegata all'opzione -i; è così che identifica se c'è un suffisso opzionale o meno):

sed -i.bak -e 2d file.csv 

si noti che non è possibile utilizzare un suffisso vuoto e hanno il compito di comando sia con BSD sed e GNU sed.

Il numero -e non è necessario in nessuna riga di comando, ma lo uso abbastanza spesso. Cito spesso anche il comando tra virgolette singole, sebbene qui non sia necessario.

Se si desidera eliminare le prime due righe di dati, utilizzare 2,3d come comando. Se si desidera eliminare le prime due righe, utilizzare 1,2d.

Se non si desidera il backup, allora si può rimuovere dopo il completamento del comando sed (più facile) oppure utilizzare il due stadi o tre fase di ballo:

sed 2d file.csv > file.csv.bak && 
mv file.csv.bak file.csv   # Oops; there went the links 

sed 2d file.csv > file.csv.bak && 
cp file.csv.bak file.csv 
rm -f file.csv.bak 

Con questi, potrebbe essere necessario aggiungere i comandi trap per pulire il file intermedio .bak se un interrupt o un altro segnale termina lo script.


Per citare la documentazione Apple per sed - che è stato originariamente citato da Diego in un answer quale ha scelto di eliminare, l'opzione -i prende un argomento che indica l'estensione da utilizzare per le copie di backup.

-iextension

Edit files in-place, saving backups with the specified extension. If a zero-length extension is given, no backup will be saved. It is not recommended to give a zero-length extension when in-place editing files, as you risk corruption or partial content in situations where disk space is exhausted, etc.

+0

Questo elimina l'elemento nella seconda riga, ma non la prima riga: "sed 2d file.csv> file.csv.bak && cp file.csv.bak file.csv rm -f file.csv.bak" – NumenorForLife

+1

Ho spiegato come eliminare le prime due righe nel file e come eliminare le prime due righe di dati nel file. Che cosa vuoi di più? –

2

sed -i.bak '2,3d' filename.csv cancellerà le linee 1 e 2 (ammesso che abbiate header)

Che questo comando non fa altro che modifica il file fa riferimento al tempo stesso la creazione di un backup del file originale (da qui l'utilizzo di .bak). La cancellazione linea '2,3d' cancellerà la 2a e 3a riga del file originale.

+0

Cosa succede se non ho intestazioni? – NumenorForLife

+1

Quindi utilizzare '1,2d' invece di '2,3d' –

+0

Cosa fare se non si desidera creare il file di backup che appare? – NumenorForLife

Problemi correlati