2012-08-27 5 views
5

Ho due file csv/di testo a cui vorrei unirmi. Entrambi contengono la stessa prima riga. Sto cercando di capire come usare sed e cat per produrre un file unito, ma con una sola copia della prima riga. E sto passando un po 'di tempo con la sintassi. Qualsiasi aiuto sarebbe molto apprezzato :-D! Grazie, AndrewFile1 + (File2 - prima riga)> File3

risposta

4

Ciò combinare i file data1.txt e data2.txt nel file di merged.txt, saltando la prima linea da data2.txt. Esso utilizza awk se siete ok con esso:

(cat data1.txt; awk 'NR>1' data2.txt) > merged.txt 

awk aggiunge tutte le linee con numero di riga> 1 dal file data2.txt a file merged.txt.

NR è una variabile di awk incorporata che rappresenta il numero di riga corrente del file in elaborazione. Se l'espressione booleana NR > 1 è vera, awk stampa implicitamente la riga.

Se non avete a cuore mantenere data1.txt intatto, si può solo aggiungere la tua seconda del file (meno la sua prima linea) e ridurre al proprio questo:

awk 'NR>1' data2.txt >> data1.txt 
+2

In alternativa, è possibile utilizzare 'tail -n + 2' invece di' awk 'NR> 1''. –

+0

@ TannerL.Swett Neat .. Stavo pensando prima di usare 'head' o' tail' in qualche modo, ma ero certo su come farlo con 'awk'. E naturalmente se OP non si preoccupava di mantenere 'data1.txt' la soluzione poteva saltare il primo comando e basta aggiungere il secondo file (-la prima riga) a quel file. – Levon

4

Un'altra opzione con awk:

awk 'NR==FNR || FNR>1' file1.txt file2.txt .. fileN.txt 

Stampa tutte le righe nel primo file, OPPURE qualsiasi riga nei file successivi dopo la prima riga.

+0

cosa succederebbe se facessi questo: 'awk 'NR == FNR || FNR> 1 '* .txt' –

+0

Si farebbe affidamento sull'ordine dei file corrispondenti al file globbing. Se contengono tutte le prime linee identiche, questo dovrebbe essere sicuro. Perché non provi e vedi cosa succede? – ghoti

1

risolto con una linea '1 d' significa eliminare prima linea in file2

il seguente comando aggiungerà il risultato File1

sed '1 d' file2 >> file1 
+0

Si sta modificando sia 'file1' che' file2' con questo comando - questo potrebbe non essere corretto con OP. Meglio fornire entrambe le opzioni (l'altra non sta cambiando nessuno dei file originali). – Levon

+0

@Levon: no, non stai modificando 'file2' qui. – tripleee

+0

@ triple Appena testato, non * cancella *, ma non * mostra * la prima riga ... capito. Potrebbe probabilmente essere meglio formulato nella risposta però. – Levon

2

direi che la soluzione più semplice è:

(cat file1.txt ; tail -n +2 file2.txt) > file3.txt 

ha il vantaggio di affermare chiaramente proprio quello che stai facendo: stampare l'intero primo file, quindi stampare tutti, ma la prima linea della SE cond file, scrivendo l'output sul terzo file.

+0

Wow !!! Grazie a tutti!!!!!!! :-D –