Jak mogę skopiować zawartość pliku tekstowego i wkleić go do innego, zaczynając od określonej linii?

13

Muszę skopiować zawartość pliku tekstowego i wkleić go do innego pliku tekstowego. Pierwszy plik tekstowy zawiera 10 wierszy danych i muszę je skopiować do drugiego pliku tekstowego, zaczynając od wiersza 5 (na przykład). Tak więc w drugim pliku tekstowym dane te należy zapisać od wiersza 5 do wiersza 14. Jak można tego dokonać? Z góry dziękuję. Uważaj mnie za debiutanta w kwestii Linuksa.

G. Paschalis
źródło

Odpowiedzi:

10

headi tailrozwiązanie

Załóżmy, że plik źródłowy jest wywoływany ~/ai plik do wstawienia jest wywoływany ~/b. Scalony plik umieścimy w ~/c:

head -n 5 ~/a > ~/c
cat ~/b >> ~/c
tail --lines=+6 ~/a >> ~/c
  • Ścieżka ~/jest krótką ręką na /home/usernazwę katalogu
  • head kopiuje pierwsze pięć wierszy pliku ado nowo utworzonego plikuc
  • cat wyświetla zawartość pliku bi dołącza go do plikuc
  • tail dołącza plik aod linii 6 do końca plikuc

Po weryfikacji zmień nazwę scalonego pliku

Po sprawdzeniu, czy plik cjest poprawnie połączone z plików ai bbędziemy zmieniać nazwy cna apodstawie:

mv ~/c ~/a
  • mvprzenosi plik cdo pliku a. Dane nie są fizycznie przenoszone. Nazwa pliku jest po prostu zmieniana, co oszczędza czas.
WinEunuuchs2Unix
źródło
Dziękuję za Twoją odpowiedź. Działa dobrze. Czy jest jednak inny sposób na zrobienie tego bez użycia trzeciego pliku tekstowego?
G. Paschalis
Po zakończeniu można zmienić nazwę trzeciego pliku na plik źródłowy. Pomyślałem, że najlepiej będzie najpierw wyświetlić plik. Dodam teraz dodatkowe kroki do odpowiedzi.
WinEunuuchs2Unix
Lub ...(head -n 5 a.txt ; cat b.txt ; tail -n +6 a.txt) > c.txt
1
@JJoao To miłe podsumowanie jednowierszowe :) Do celów nauczania wolę używać jednego wiersza na metodę polecenia i zagnieżdżone instrukcje if. Jednak do kopiowania i wklejania do terminalu uwielbiam te jeden wkładki!
WinEunuuchs2Unix,
16

Najłatwiejszym narzędziem może być tutaj sed. Aby wstawić b.txtdo a.txtpo 5 linii, można napisać:

sed '5r b.txt' a.txt

sedczyta plik określony jako argument ( a.txt) wiersz po wierszu. Wszystkie linie są odtwarzane na wyjściu tak, jak pojawiały się na wejściu, chyba że zostaną zmienione przez polecenie.

5Jest adres (numer linii), w którym następujące polecenie zostanie wykonane. Poleceniem, którego używamy jest r, który przyjmuje nazwę pliku jako argument (tutaj b.txt), czyta go całkowicie i wstawia do wyniku po bieżącym wierszu.

Jak widać powyżej, ten sedwiersz poleceń wypisze tylko dane wyjściowe do terminala, bez zapisywania do żadnych plików. Możesz przekierować go do nowego pliku (nie do żadnego z plików wejściowych!), Używając przekierowania wyjściowego Basha:

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

Albo można bezpośrednio modyfikować zewnętrznego pliku wejściowego a.txtprzy użyciu sed„s -i(«in-place») przełącznika. Jeśli zapiszesz go jako -i.bak, najpierw utworzy kopię zapasową oryginalnego pliku wejściowego z sufiksem .bak:

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

Przykład:

$ 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
Bajt Dowódca
źródło
0

(Ponownie wykorzystując elegancki przykład z @ByteCommander :)

awk '1; NR==5 {system("cat b.txt")}' a.txt

źródło