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
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
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.
cosa succederebbe se facessi questo: 'awk 'NR == FNR || FNR> 1 '* .txt' –
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
risolto con una linea '1 d' significa eliminare prima linea in file2
il seguente comando aggiungerà il risultato File1
sed '1 d' file2 >> file1
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
@Levon: no, non stai modificando 'file2' qui. – tripleee
@ triple Appena testato, non * cancella *, ma non * mostra * la prima riga ... capito. Potrebbe probabilmente essere meglio formulato nella risposta però. – Levon
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.
Wow !!! Grazie a tutti!!!!!!! :-D –
In alternativa, è possibile utilizzare 'tail -n + 2' invece di' awk 'NR> 1''. –
@ 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