Come posso copiare il contenuto di un file di testo e incollarlo in un altro a partire da una determinata riga?


12

Devo copiare il contenuto di un file di testo e incollarlo in un altro file di testo. Il primo file di testo ha 10 righe di dati e ho bisogno che vengano copiate nel secondo file di testo a partire dalla riga numero 5 (ad esempio). Quindi nel secondo file di testo quei dati dovrebbero essere scritti dalla riga 5 alla riga 14. Come si può fare? Grazie in anticipo. Considerami un novellino per quanto riguarda Linux.

Risposte:


9

heade tailsoluzione

Supponiamo che venga chiamato ~/ail file sorgente e venga chiamato il file da inserire ~/b. Metteremo il file unito in ~/c:

head -n 5 ~/a > ~/c
cat ~/b >> ~/c
tail --lines=+6 ~/a >> ~/c
  • Il percorso ~/è una scorciatoia per il /home/usernome della directory
  • head copia le prime cinque righe del file anel file appena creatoc
  • cat elenca il contenuto del file be lo aggiunge al filec
  • tail aggiunge il file a apartire dalla riga 6 fino alla fine del filec

Dopo la verifica, rinominare il file unito

Dopo aver verificato che il file cviene unito correttamente dai file ae brinomineremo cin auso:

mv ~/c ~/a
  • mvsposta il file cnel file a. I dati non vengono spostati fisicamente. Il file viene semplicemente rinominato per risparmiare tempo.

La ringrazio per la risposta. Ha funzionato bene. Tuttavia, esiste un altro modo per farlo senza utilizzare un terzo file di testo?
G. Paschalis,

Al termine, il terzo file può essere rinominato nel file di origine. Ho pensato che fosse meglio poter prima visualizzare il file. Aggiungerò ora i passaggi aggiuntivi alla risposta.
WinEunuuchs2Unix,

Oppure ...(head -n 5 a.txt ; cat b.txt ; tail -n +6 a.txt) > c.txt

1
@JJoao Questo è un bel riassunto di una riga :) Ai fini dell'insegnamento preferisco usare una riga per metodo di comando e annidare le istruzioni if. Tuttavia, per copiare e incollare nel terminale, adoro le fodere!
WinEunuuchs2Unix

16

Lo strumento più semplice qui potrebbe essere sed. Per inserire b.txtin a.txtdopo il 5 ° linea, si potrebbe scrivere:

sed '5r b.txt' a.txt

sedlegge il file specificato come argomento ( a.txt) riga per riga. Tutte le righe vengono riprodotte nell'output così come sono apparse nell'input, a meno che non vengano modificate da un comando.

Il 5è un indirizzo (numero di riga) in cui è eseguito il seguente comando. Il comando che usiamo è r, che prende un nome di file come argomento (qui b.txt), lo legge completamente e lo inserisce nell'output dopo la riga corrente.

Come sopra, questa sedriga di comando stampa solo l'output sul terminale, senza scrivere su alcun file. Puoi reindirizzarlo a un nuovo file (non a nessuno dei file di input!) Usando il reindirizzamento di output di Bash:

sed '5r b.txt' a.txt > c.txt

Oppure puoi modificare direttamente il file di input esterno a.txtusando sedl'opzione ' -i(per "sul posto"). Se lo scrivi come -i.bak, eseguirà prima una copia di backup del file di input originale con il suffisso .bak:

sed -i '5r b.txt' a.txt

Un esempio:

$ cat a.txt 
January
February
March
April
May
October
November
December

$ cat b.txt 
June
July
August
September

$ sed '5r b.txt' a.txt
January
February
March
April
May
June
July
August
September
October
November
December

0

(Riutilizzando un esempio elegante di @ByteCommander :)

awk '1; NR==5 {system("cat b.txt")}' a.txt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.