Czy istnieje prosty sposób na powtórzenie pliku z pominięciem pierwszej i ostatniej linii? Patrzyłem na rurociągi z head do tail, ale dla nich wydaje się, że musiałbym znać całkowitą liczbę linii od samego początku. Patrzyłem również na split, ale też nie widzę sposobu, aby to zrobić.
Odpowiedź
Tylko z sed, bez potoków:
sed "1d;$d" file.txt
UWAGA
-
1znaczy pierwsza linia -
dśrednia delete -
;jest separatorem dla 2 poleceń -
$oznacza ostatnia linia
Odpowiedź
Nie musisz z góry znać liczby wierszy. tail i head mogą przyjąć przesunięcie odpowiednio od początku lub końca pliku.
Ten potok zaczyna się od drugiej linii pliku (pomijając pierwszą linię) i zatrzymuje się na przedostatniej (pomijając ostatnią linię). Aby pominąć więcej niż jedną linię na początku lub na końcu, odpowiednio dostosuj liczby.
tail -n +2 file.txt | head -n -1
robiąc to w drugą stronę, oczywiście działa tak samo:
head -n -1 file.txt | tail -n +2
Komentarze
Odpowiedź
Oto jak to zrobić z awk:
awk "NR>2 {print t} {t=$0}"
Również inny sposób na sed:
sed "1d;x" file.txt
x jest zaawansowanym poleceniem sed, przełącza bieżącą linię za pomocą poprzedni: prąd idzie do bufora i poprzedni s przechodzi do ekranu i tak dalej, podczas gdy sed przetwarza strumień linia po linii (dlatego pierwsza linia będzie pusta).
awk rozwiązanie w każdym kroku (linii) umieszcza bieżącą linię w zmiennej i rozpoczyna jej drukowanie dopiero po przejściu drugiej linii. W ten sposób na ekranie pojawiła się gówniana sekwencja linii od przedostatniej do przedostatniej. Ostatnia linia jest pomijana, ponieważ linia znajduje się w zmiennej i powinna zostać wydrukowana dopiero w następnym kroku, ale wszystkie kroki już się skończyły i nigdy nie widzimy linii na ekranie.
Ten sam pomysł w perl:
perl -ne "print $t if $.>2 ; $t=$_" file.txt
$. oznacza numer linii, a $_ bieżącą linię.
perl -n to skrót do while(<..>) {..} struktura i -e jest dla skryptu wbudowanego.
Odpowiedź
Użytkownicy komputerów Mac:
Na Macu head -n -1 nie działa. Zamiast tego odwróć plik, odetnij pierwszą linię, a następnie odwróć ją z powrotem:
tail -r file.txt | tail -n +2 | tail -r
Wyjaśnienie:
-
tail -r: odwraca kolejność wierszy na wejściu -
tail -n +2: wyświetla cały plik l iny zaczynające się od drugiej linii w swoim wejściu
Komentarze
- Nie powiedzie się z
head: illegal line count -- -1dokładnie.
Odpowiedź
W Pythonie chciałbym to zrobić.
#!/usr/bin/python3 import re import sys file = sys.argv[1] with open(file, "r") as f: L = [] for line in f: line = re.sub(r"\n", r"", line) L.append(line) print("\n".join(L[1:-1]))
Wklej powyższy kod do pliku i nadaj mu nazwę script.py. Uruchom skrypt dla pliku, który chcesz sprawdzić.
python3 script.py /path/to/the/file
Przykład:
$ cat file foo apple banana bar $ python3 script.py file apple banana
Komentarze
-
''.join(list(open("/path/to/file"))[1:-1]): Wydaje się, że jest to prostsze rozwiązanie 🙂 A jeśli chcesz to zrobić bezpośrednio w wierszu poleceń, możesz spróbować:python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'
head -n -1usuwa pierwszą ORAZ ostatnią linię mojego pliku.txtw systemie Ubuntu 14.04.2LTS.head -n -1mówi, żehead: illegal line count -- -1head -n -1działa z GNU coreutils, może MacOS ma jakiś wariant BSD?