Plik wejściowy 1 to:
dog 123 4335
cat 13123 23424
deer 2131 213132
bear 2313 21313
Daję dopasowaniu wzór z other file
(jak dog 123 4335
z pliku 2).
Dopasowuję wzór linii dog 123 4335
i po wydrukowaniu wszystkich linii bez linii dopasowania, mój wynik to:
cat 13123 23424
deer 2131 213132
bear 2313 21313
Jeśli użyjesz tylko bez adresu linii, użyj tylko wzoru, na przykład 1s
jak dopasować i wydrukować linie?
text-processing
sed
grep
loganaayahee
źródło
źródło
Odpowiedzi:
Zakładając, że chcesz dopasować całą linię do swojego wzoru, z GNU
sed
, działa to:Standardowy odpowiednik:
Z następującymi danymi wejściowymi (
infile
):Dane wyjściowe to:
Wyjaśnienie:
/^dog 123 4335$/
szuka żądanego wzoru.:a; n; p; ba;
to pętla, która pobiera nowy wiersz z input (n
), drukuje go (p
) i rozgałęzia z powrotem, aby oznaczyć a:a; ...; ba;
.Aktualizacja
Oto odpowiedź, która zbliża się do twoich potrzeb, tj. Wzorzec w pliku 2, grepowanie z pliku 1:
Osadzony grep i cut znajdują pierwszą linię zawierającą wzór z pliku2, ten numer linii plus jeden jest przekazywany do ogona, plus jeden służy do pominięcia linii ze wzorem.
Jeśli chcesz zacząć od ostatniego meczu zamiast pierwszego, byłoby to:
Pamiętaj, że nie wszystkie wersje ogona obsługują notację plusa.
źródło
sed -n '/^dog 123 4335$/ { :a; p; n; ba; }' infile
(przy przełączonych p i n) z powodzeniem zawiera również pasującą linię.Jeśli masz dość krótki
grep
sam plik , może działać:Domyślam się, że 5000 jest „dość krótkie”, ponieważ
grep
znajduje pierwsze dopasowanie i wysyła je wraz z następnymi 5000 liniami (plik nie musi mieć tak wielu). Jeśli nie chcesz samego dopasowania, musisz je odciąć, npJeśli nie chcesz pierwszego, ale ostatniego dopasowania jako separatora, możesz użyć tego:
Ta linia odczytuje
animals.txt
w odwrotnej kolejności linie i wyjścia do linii włącznie z linią,dog 123 4335
a następnie ponownie cofa, aby przywrócić prawidłową kolejność.Ponownie, jeśli nie potrzebujesz dopasowania w wyniku, dołącz ogon. (Możesz także skomplikować wyrażenie sed, aby odrzucić jego bufor przed zakończeniem.)
źródło
W praktyce prawdopodobnie używałbym odpowiedzi Aet3miirah przez większość czasu, a odpowiedź Alexeya jest cudowna, gdy chce się poruszać po liniach (również działa z
less
). OTOH, naprawdę podoba mi się inne podejście (które jest rodzajem odwróconej odpowiedzi Gillesa :Po wywołaniu z
-n
flagąsed
nie drukuje domyślnie linii, które przetwarza. Następnie używamy 2-adresowego formularza, który mówi, aby zastosować polecenie od dopasowania linii/dog 123 4335/
do końca pliku (reprezentowanego przez$
). Poleceniep
, o którym mowa , drukuje bieżący wiersz. Oznacza to więc „wydrukuj wszystkie linie od jednego pasującego/dog 123 4335/
do końca”.źródło
dog
linię, która nie jest tutaj pożądana.sed -n '/dog 123 4335/,$p' | tail -n +2
usunie również meczJeśli chcesz odczytać wzorzec z pliku, zastąp go poleceniem sed. Jeśli plik zawiera wzorzec sed:
Jeśli plik zawiera dosłowny ciąg do wyszukania, wpisz wszystkie znaki specjalne. Zakładam, że plik zawiera jedną linię.
Jeśli chcesz, aby dopasowaniem była cała linia, a nie tylko podciąg, zawiń wzór
^…$
.źródło
sed
ma0,/dog.../d
na to.$ more +/"dog 123 4335" file1
źródło
less
.tac
.+
został zastąpiony przez-p
POSIX 7: pubs.opengroup.org/onlinepubs/9699919799/utilities/more.html, ale nie został jeszcze zaimplementowany w util-linux 2.20.1. I to również drukujeskipping..
i kilka nowych linii (do stderr oczekuję, więc może być w porządku).Z
awk
:źródło
Jednym sposobem jest użycie awk:
gdzie plik2 zawiera wzorce wyszukiwania. Po pierwsze, cała zawartość pliku2 jest przechowywana w tablicy „a”. Podczas przetwarzania pliku1 każdy wiersz jest sprawdzany względem tablicy i drukowany tylko wtedy, gdy nie jest obecny.
źródło
Jeśli dane wejściowe są zwykłym plikiem możliwym do zobaczenia :
Z GNU
grep
:Z
sed
:GNU o
grep
nazwie w /-m
opcja przerwie wprowadzanie podczas dopasowania - i opuści swoje (możliwe do zobaczenia) wejście fd natychmiast po punkcie, w którym znalazł swoje ostatnie dopasowanie. Tak więc wywołaniegrep
w /-m1
znajduje pierwsze wystąpienie wzorca w pliku i pozostawia przesunięcie wejściowe dokładnie w odpowiednim miejscucat
do zapisania wszystkiego po pierwszym dopasowaniu wzorca do pliku na standardowe wyjście.Nawet bez GNU
grep
możesz zrobić dokładnie to samo z kompatybilnym z POSIXsed
- kiedysed
q
uits jest określony, aby pozostawić przesunięcie wejściowe dokładnie tam, gdzie to robi. GNUsed
nie jest jednak w ten sposób zgodny ze standardami, więc powyższe prawdopodobnie nie będzie działać z GNU,sed
chyba że wywołasz go za pomocą-u
przełącznika.źródło
sed
pokazane tutaj współdzielenie strumienia nie jest specjalnie (choć tak, wspomniany standard podaje konkretny przykładsed
jako narzędzie, które jest w ten sposób zdolne) pokazanego swobodnego przepływu pracy. w szczególności wszystkie standardowe narzędzia są przeznaczone i określone do współpracy i współdzielenia pozycji kursorów strumieni wejściowych, nie powodując przy tym żadnego przetwarzania żadnego następnego czytnika.grep -q
powinien to zrobić; po cichugrep
powinien powrócić, gdy tylko zostanie znalezione dopasowanie w danych wejściowych, a wszelkie pozostałe dane wejściowe nie powinny być standardowo zużywane.Moja odpowiedź na pytanie w temacie, bez zapisywania wzoru w drugim pliku. Oto mój plik testowy:
GNU sed:
Perl:
Wariant Perla ze wzorem w pliku:
źródło
Wth
ed
:To wysyła jedno
p
polecenie rint do ed w ciągu tutaj; polecenie drukowania jest ograniczone w zakresie do jednego po (+1
)dog 123 4335
dopasowaniu do końca pliku ($
).źródło
Jeśli nie przeszkadza ci utworzenie pliku tymczasowego i masz go do
csplit
dyspozycji, działa to:Uwaga
file1
jest plikiem wejściowym i plikiemfile2
wzoru (jak podano w pytaniu).Długa postać powyższego polecenia to:
to znaczy,
csplit
bezprefix
powyższej flagi utworzyłby plikxx00
(prefiksxx
i sufiks00
). Z flagą powyżej tworzy plikfile1_00
. Bezquiet
flagi drukuje rozmiar pliku wyjściowego (rozmiar pliku wynikowego).źródło
Ponieważ awk nie jest wyraźnie niedozwolone, oto moja oferta, zakładając, że „kot” jest dopasowany.
źródło
Innym sposobem na określenie tego jest „jak usunąć wszystkie wiersze z pierwszego do dopasowania (w tym)”, i można to
sed
napisać jako:źródło
sed -e '0,/MATCH PATTERN/d'
wtedy?