Jak usunąć pierwsze n wierszy pliku ascii za pomocą poleceń powłoki?

92

Mam wiele plików, które zawierają informacje tekstowe ascii w pierwszych 5-10 wierszach, a następnie dobrze tabelaryczne informacje o macierzy. W skrypcie powłoki chcę usunąć kilka pierwszych wierszy tekstu, aby móc użyć informacji o czystej macierzy w innym programie. Jak mogę w tym celu użyć poleceń powłoki bash?

Jeśli to pomoże, używam RedHata i systemów Linux Ubuntu.

Paweł
źródło

Odpowiedzi:

143

Tak długo, jak plik nie jest dowiązaniem symbolicznym ani dowiązaniem twardym, możesz używać sed, tail lub awk. Przykład poniżej.

$ cat t.txt
12
34
56
78
90

sed

$ sed -e '1,3d' < t.txt
78
90

Można również użyć sed w miejscu bez pliku tymczasowego: sed -i -e 1,3d yourfile. To nic nie powtórzy, po prostu zmodyfikuje plik w miejscu. Jeśli nie musisz przesyłać wyniku do innego polecenia, jest to łatwiejsze.

ogon

$ tail -n +4 t.txt
78
90

awk

$ awk 'NR > 3 { print }' < t.txt
78
90
Ignacio Vazquez-Abrams
źródło
8
Można również użyć sed w miejscu bez pliku tymczasowego: sed -i -e 1,3d yourfile. To nic nie powtórzy, po prostu zmodyfikuje plik w miejscu. Jeśli nie musisz przesyłać wyniku do innego polecenia, jest to łatwiejsze.
Yanick Girouard
1
Dzięki @YanickGirouard, @IgnacioVazquezAbrams! Wy dwoje właśnie zaoszczędziliście mi mnóstwo pracy fizycznej przy moich badaniach! :)
Paul
2
@Svetlana sed -ikonkretnie. Większość implementacji po prostu usuwa plik i zastępuje go nowym, co nie działa w przypadku linków, ponieważ ostatecznie pozostawiasz oryginał w innym miejscu.
jw013
6
co powiesz na wyjaśnienie, co „1,3d”, +4, i in. znaczy? Pytanie dotyczyło n linii, ale nie powiedziałeś, co to jest n (najwyraźniej n wynosi 2 w twoich przykładach, chociaż noob nie jest oczywiste, co należy zmienić, aby zmienić n)
Robin Manoli
3
Używa pliku tymczasowego, więc nie jest bardzo przydatny w przypadku 100% wykorzystania miejsca na dysku. Byłoby interesujące mieć rozwiązanie, które robi to dosłownie „na miejscu”.
Shai
10

sed -i '1,3d' file.txt

Spowoduje to usunięcie pierwszych 3 wierszy z pliku.txt.

Alhelal
źródło
6

Jeśli linie tabelaryczne to te, które mają znak tabulacji:

grep '␉' <input_file >output_file

( będący dosłownym znakiem tabulacji) lub równoważnie

sed -n '/␉/p' <input_file >output_file

W skrypcie bash / ksh / zsh możesz pisać $'\t'dla karty, np . grep $'\t'Lub sed -n $'/\t/p'.

Jeśli chcesz wyeliminować 10 linii na początku pliku:

tail -n +11 <input_file >output_file

(zwróć uwagę, że ma to na +11celu wyeliminowanie 10 linii, ponieważ +11oznacza „zacznij od linii 11”, a numery linii od 1) lub

sed '1,10d' <input_file >output_file

W systemie Linux możesz skorzystać z opcji GNU sed, -iaby zmodyfikować pliki w miejscu:

sed -i -n '/\t/p' *.txt

Lub możesz użyć pętli powłoki i plików tymczasowych:

for x in *.txt; do
  tail -n +11 <"$x" >"$x.tmp"
  mv "$x.tmp" "$x"
done

Lub jeśli nie chcesz modyfikować plików w miejscu, ale zamiast tego nadaj im inną nazwę:

for x in *.txt; do
  tail -n +11 <"$x" >"${x%.txt}.data"
done
Gilles
źródło
3
„tabulowane” zwykle oznacza „ładnie wydrukowane w tabeli”, a nie „wcięte znakami tabulacji”.
Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams Wiem. Ładnie wydrukowana tabela czasami używa znaków tabulacji, co jest łatwiejsze do wykrycia niż wyrównane kolumny. Oczywiście, jeśli Paul podałby przykładowy wkład, mógłbym dać lepszy układacz.
Gilles
2

Możesz używać Vima w trybie Ex:

ex -sc '1d5|x' file
  1. 1 przejdź do pierwszej linii

  2. 5 wybierz 5 linii

  3. d usunąć

  4. x Zapisz i zamknij

Steven Penny
źródło
0

echo "a \ nb" | sed „1d” # usuwa pierwszą linię

cat list.txt | sed '1d'> list.csv # czytaj list.txt i napisz list.csv bez pierwszej linii

Inne przydatne polecenia:

grep '^ |' # znajduje pierwszy znak (potok |)

sed 's / | // g' # usuwa potok

sed 's / // g' # usuwa spację

Samran Elahi
źródło
0

Procentowo

Używając bash, do czyszczenia pliku przy użyciu liczby procentowej zamiast bezwzględnej liczby wierszy:

sed -i -e 1,$( printf  "$((`cat php_errors.log | wc -l` * 75 /100 ))" )d php_errors.log

Uważaj, ponieważ to polecenie może być destrukcyjne, ponieważ usuwa zawartość w miejscu, bez tworzenia kopii.

Usuwa pierwsze 75% linii ze wspomnianego pliku.

pgr
źródło