Plik:
Data inserted into table. Total count 13
No error occurred
Data inserted into table. Total count 45
No error occurred
Data inserted into table. Total count 14
No error occurred
Data inserted into table. Total count 90
No error occurred
Oczekiwany plik wyjściowy:
Data inserted into table. Total count 13
Data inserted into table. Total count 45
Data inserted into table. Total count 14
Data inserted into table. Total count 90
Chcę, aby wynik wyglądał w ten sposób: co druga linia zostanie usunięta, ale nie będzie przerwy między wierszami.
text-processing
sed
awk
pmaipmui
źródło
źródło
grep -v "No error occurred" file
to polecenie powinno działać ... na co odpowiedział @paul. W pliku wyjściowym nie będzie linii zawierających „Nie wystąpił błąd” tej części.Odpowiedzi:
Z
sed
:Z POSIX
awk
:Jeśli masz starsze
awk
(jakoawk
), potrzebujesz:Z
ex
:edytuje plik na miejscu.
g
zaznacz globalne polecenie/$/
dopasuj wszystkie linie+d
usuń następny wierszwq!
Zapisz wszystkie zmianyTo podejście łączy ten sam ideał z
sed
podejściem, usuwaj każdą kolejną linię bieżącego początku linii od linii 1.Z
perl
:i
perl6
:źródło
n\;d
zamiast'n;d'
ocalić cenną postać, ale ta logika wychodzi z okna, gdy niepotrzebnie używasz-e
przełącznika i przekierowania pliku<
!sed -e 'n;d'
, ocalić jedną postać.n
polecenie zapisz przestrzeń wzorców na standardowe wyjście, jeśli-n
została użyta, a następnie zamień przestrzeń wzorców na następny wiersz. Tutaj każda nieparzysta linia zostanie wydrukowana przezn
, parzysta linia, a następnied
wczytana do przestrzeni wzorów, ale natychmiast usunięta za pomocą polecenia`.Rozwiązanie tego przez usunięcie co drugiej linii może być podatne na błędy (na przykład, gdy proces czasami generuje dwie znaczące linie zamiast jednej). Być może lepiej jest odfiltrować śmieci:
Może działać jako filtr, możesz tutaj dodać więcej wzorców śmieci i poprawić wynik.
źródło
Odpowiadając na pytanie, z GNU
sed
:usunie co drugi wiersz, ale chciałbym zaoferować filtrowanie wierszy według zawartości:
lub z tym samym wynikiem
źródło
grep Data
igrep -v 'No error'
Oto sposób użycia
sed
:Inny sposób z GNU
sed
:Dane wyjściowe z powyższych poleceń:
źródło
shortest way using sed
?g
dowodzenia?sed -n 'p;n'
wystarczy.g
. usunięto g z polecenia. :)Możesz spróbować z
awk
:lub możesz wydrukować tylko linie zawierające
Data inserted
:źródło
Inna odpowiedź, możesz użyć vi / vim!
A jeśli twój plik miał na przykład 500 linii (wpisz)
A potem napisać i wyjść
Lub jeśli coś pójdzie nie tak i nie chcesz oszczędzać:
Wyjaśnienie:
źródło
Oto całkiem inny sposób:
Zakłada się, że linie nieparzyste nie zawierają tabulatorów. Jeśli tak, musisz wybrać inny znak separatora, np.
:
Tutaj:źródło
sed
z ogromnym plikiem (np. 20 mil linii). W każdym razie +1, ale tak naprawdę, aby uniknąć bólów głowy, wybierz ogranicznik, który prawdopodobnie nie wystąpi w pliku tekstowym, na przykład$'\002'
...seq 100000000 > 100mil.txt
.paste|cut
Roztwór zakończone w ciągu około 7,5 sekund, VS prawie 12 nased
roztwór. Wydaje się być powtarzalne.grep
jest jednak najszybszy. Ubuntu 14.04 ze standardowymi narzędziami GNU.paste
+cut
są mocno zoptymalizowani do swojej pracy, więc nic dziwnego, że ich kombinacja jest cholernie szybka ...Inna opcja (krótsza)
źródło
sed n\;d
, dodawanie-e
to tylko mój nawyk.Rozwiązuje również problem, choć jest nieco wolniejszy:
źródło