Ta linia działała, dopóki nie miałem białych znaków na drugim polu.
svn status | grep '\!' | gawk '{print $2;}' > removedProjs
czy istnieje sposób, aby awk wydrukował wszystko za 2 USD lub więcej? (3 USD, 4 USD ... dopóki nie będziemy już mieć kolumn?)
Powinienem dodać, że robię to w środowisku Windows z Cygwin.
grep | awk
Nawiasem mówiąc , jest to antypattern - chceszawk '/!/ { print $2 }'
svn status | grep '\!' | cut -d' ' -f2- > removedProjs
Odpowiedzi:
wypisze wszystkie oprócz pierwszej kolumny:
wydrukuje wszystkie oprócz dwóch pierwszych kolumn:
źródło
awk '{$1=""; print substr($0,2)}' input_filename > output_filename
awk -F, -vOFS=, '{$1=""; print $0}'
Otrzymasz początkowy separator ($1
nadal jest zawarty, podobnie jak pusty ciąg). Możesz to rozebrać za pomocąsed
:awk -F, -vOFS=, '{$1=""; print $0}' | sed 's/^,//'
Istnieje zduplikowane pytanie z prostszą odpowiedzią przy użyciu cut:
-d
określa ogranicznik (spację) ,-f
określa listę kolumn (wszystkie zaczynające się na 2.)źródło
awk
wersja, występują problemy z buforowaniem liniicut
, któreawk
nie mają: stackoverflow.com/questions/14360640/…awk
traktuje wiele sąsiednich znaków kosmicznych. jako pojedynczy separator, podczas gdycut
nie; także - chociaż nie jest to problem w niniejszej sprawie -cut
akceptuje tylko jeden, dosłowny znak. jako separator, a jednocześnieawk
pozwala na wyrażenie regularne.Możesz użyć pętli for, aby przejść przez pola drukowania od 2 $ do $ NF (wbudowana zmienna reprezentująca liczbę pól w linii).
Edycja: Ponieważ „print” dodaje nowy wiersz, będziesz chciał buforować wyniki:
Alternatywnie użyj printf:
źródło
'{for(i=11;i<=NF-1;i++){printf "%s ", $i}; print $NF;}'
brak spacji wiodących i końcowych.Moja odpowiedź jest oparta na jednej z VeeArr , ale zauważyłem, że zaczęła się od białej spacji, zanim wydrukuje drugą kolumnę (i resztę). Ponieważ mam tylko 1 punkt reputacji, nie mogę go komentować, więc oto nowa odpowiedź:
zacznij od „out” jako drugiej kolumny, a następnie dodaj wszystkie pozostałe kolumny (jeśli istnieją). To idzie dobrze, o ile istnieje druga kolumna.
źródło
Większość rozwiązań z awk pozostawia miejsce. Opcje tutaj unikają tego problemu.
opcja 1
Proste rozwiązanie cięcia (działa tylko z pojedynczymi ogranicznikami):
Opcja 2
Wymuszanie ponownego obliczenia awk czasami usuwa dodatkową przestrzeń wiodącą (OFS) pozostałą przez usunięcie pierwszych pól (działa z niektórymi wersjami awk):
Opcja 3
Drukowanie każdego pola sformatowanego za pomocą
printf
daje większą kontrolę:Jednak wszystkie poprzednie odpowiedzi zmieniają wszystkie powtarzane FS między polami na OFS. Zbudujmy kilka opcji, które tego nie robią.
Opcja 4 (zalecana)
Pętla z sub do usuwania pól i ograniczników z przodu.
I używając wartości FS zamiast spacji (którą można zmienić).
Jest bardziej mobilny, a nie powoduje zmiany FS OFS: UWAGA:
^[FS]*
jest zaakceptować wejście z czołowych miejsc.Opcja 5
Jest całkiem możliwe zbudowanie rozwiązania, które nie dodaje dodatkowych (początkowych lub końcowych) białych znaków i zachowuje istniejące białe znaki za pomocą funkcji
gensub
z GNU awk, ponieważ:Można go również użyć do zamiany grupy pól z podaną liczbą
n
:Oczywiście w takim przypadku OFS służy do oddzielenia obu części linii, a końcowa biała przestrzeń pól jest nadal drukowana.
UWAGA:
[FS]*
służy do dopuszczenia spacji wiodących w linii wejściowej.źródło
Osobiście wypróbowałem wszystkie wyżej wymienione odpowiedzi, ale większość z nich była nieco złożona lub po prostu nie tak. Z mojego punktu widzenia najłatwiej to zrobić:
Gdzie -F „” definiuje ogranicznik, którego ma używać awk. W moim przypadku jest to biały znak, który jest również domyślnym ogranicznikiem dla awk. Oznacza to, że -F „” można zignorować.
Gdzie NF określa całkowitą liczbę pól / kolumn. Dlatego pętla rozpocznie się od 4. pola do ostatniego pola / kolumny.
Gdzie $ N pobiera wartość N-tego pola. Dlatego print $ i wydrukuje bieżące pole / kolumnę na podstawie liczby pętli.
źródło
lauhub proponuje rozwiązać ten problem, proste i szybkie rozwiązanie tutaj
źródło
Tak bardzo mnie to irytowało, że usiadłem i napisałem
cut
parser specyfikacji pola, przetestowany z GNU Awk 3.1.7.Najpierw utwórz nowy skrypt biblioteki Awk o nazwie
pfcut
, npNastępnie wklej poniższy skrypt i zapisz. Następnie wygląda to tak:
Aby uniknąć wpisywania tego wszystkiego, myślę, że najlepiej jak potrafisz (zobacz inaczej Automatycznie ładuj funkcję użytkownika podczas uruchamiania z awk? - Unix i Linux Stack Exchange ) dodaje alias do
~/.bashrc
; np. z:... wtedy możesz po prostu zadzwonić:
Oto źródło
pfcut
skryptu:źródło
cut
, a nieawk
Wydruk kolumn zaczynających się od nr 2 (na początku nie będzie kończyć się spacją):
źródło
+
po spacji, ponieważ pola mogą być oddzielone więcej niż 1 spacją (awk
traktuje wiele sąsiadujących spacji jako pojedynczy separator). Ponadtoawk
zignoruje spacje wiodące, więc powinieneś zacząć od wyrażenia regularnego^[ ]*
. Dzięki spacji jako separatorowi możesz nawet uogólnić rozwiązanie; np. następujące zwraca wszystko z trzeciego pola:awk '{sub(/^[ ]*([^ ]+ +){2}/, ""); print $0}'
Staje się jednak trudniejsze z dowolnymi separatorami pól.Czy to zadziała?
Pozostawia jednak trochę białych znaków z przodu.
źródło
ten używa awk do wypisania wszystkich oprócz ostatniego pola
źródło
Oto, co wolałem od wszystkich zaleceń:
Drukowanie od 6 do ostatniej kolumny.
lub
źródło
Jeśli potrzebujesz konkretnych kolumn wydrukowanych z dowolnym ogranicznikiem:
Więc jeśli masz białą spację w kolumnie, będą to dwie kolumny, ale możesz połączyć ją z dowolnym separatorem lub bez niego.
źródło
Rozwiązanie Perla:
Używane są następujące opcje wiersza polecenia:
-n
pętli wokół każdej linii pliku wejściowego, nie drukuj automatycznie każdej linii-l
usuwa nowe linie przed przetwarzaniem i dodaje je z powrotem-a
tryb autosplit - dzieli linie wejściowe na tablicę @F. Domyślnie podział na białe znaki-e
wykonaj kod perlasplice @F,0,1
czysto usuwa kolumnę 0 z tablicy @Fjoin " ",@F
łączy elementy tablicy @F, używając spacji między każdym elementemRozwiązanie Python:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[1:]) + '\n') for line in sys.stdin]" < file
źródło
Jeśli nie chcesz ponownie sformatować tej części wiersza, której nie odetniesz, najlepsze rozwiązanie, jakie mogę wymyślić, znajduje się w mojej odpowiedzi w:
Jak wydrukować wszystkie kolumny po określonej liczbie za pomocą awk?
Wycina to, co jest przed danym polem o numerze N, i drukuje całą resztę wiersza, w tym pole o numerze N i zachowując oryginalne odstępy (nie jest ponownie formatowane). Nie ma znaczenia, czy ciąg pola pojawia się również gdzieś w linii.
Zdefiniuj funkcję:
I użyj tego w ten sposób:
Wyjście zachowuje wszystko, w tym końcowe spacje
W twoim konkretnym przypadku:
Jeśli twój plik / strumień nie zawiera znaków nowej linii na środku linii (możesz użyć innego separatora rekordów), możesz użyć:
Pierwszy przypadek zawiedzie tylko w plikach / strumieniach zawierających rzadki znak szesnastkowy 1
źródło
Działa to, jeśli używasz Bash i możesz użyć tylu „x” jako elementów, które chcesz odrzucić, a ignoruje wiele spacji, jeśli nie są one poprzedzone znakiem ucieczki.
źródło
Perl:
źródło
Ta
awk
funkcja zwraca podłańcuch tego,$0
który zawiera pola odbegin
doend
:Aby uzyskać wszystko, zaczynając od pola 3:
Aby uzyskać sekcję,
$0
która obejmuje pola od 3 do 5:b, e, p, i
bzdury na liście parametrów funkcji to tylkoawk
sposób na zadeklarowanie zmiennych lokalnych.źródło
Chcę rozszerzyć proponowane odpowiedzi na sytuację, w której pola są ograniczone prawdopodobnie kilkoma białymi spacjami - powód, dla którego PO nie używa
cut
przypuszczam, że .Wiem, że o OP pytano
awk
, alesed
tutaj zadziałałoby podejście (przykład z drukowaniem kolumn od piątego do ostatniego):podejście czysto sed
Wyjaśnienie:
s///
jest używany standardowy sposób przeprowadzania podstawienia^\s*
dopasowuje dowolne kolejne białe znaki na początku linii\S+\s+
oznacza kolumnę danych (znaki inne niż białe znaki, a następnie znaki białe znaki)(){4}
oznacza, że wzór powtarza się 4 razy.sed and cut
po prostu zastępując kolejne białe znaki jedną kartą;
tr and cut:
tr
można również użyć do wyciskania kolejnych znaków z-s
opcją.źródło
Przykłady awk wyglądają tutaj na skomplikowane, oto prosta składnia powłoki Bash:
Gdzie
1
jest Twoja n- ta kolumna, licząc od 0.Przykład
Biorąc pod uwagę tę zawartość pliku (
in.txt
):oto wynik:
źródło
Nie byłem zadowolony z żadnego z
awk
przedstawionych tu rozwiązań, ponieważ chciałem wyodrębnić kilka pierwszych kolumn, a następnie wydrukować resztę, więc zwróciłem się do nichperl
. Poniższy kod wyodrębnia dwie pierwsze kolumny i wyświetla pozostałe w niezmienionej postaci:Zaleta w porównaniu do
perl
rozwiązania Chrisa Koknata jest to, że tak naprawdę tylko pierwsze n elementów jest oddzielonych od ciągu wejściowego; reszta łańcucha nie jest w ogóle podzielona i dlatego pozostaje całkowicie nienaruszona. Mój przykład pokazuje to za pomocą kombinacji spacji i tabulatorów.Aby zmienić liczbę kolumn, które należy wyodrębnić, zamień
3
w tym przykładzie na n + 1.źródło
z tej odpowiedzi nie jest źle, ale naturalne odstępy zniknęły.
Porównaj to z tym:
Wtedy zobaczysz różnicę.
Nawet
ls -la | awk '{$1=$2=""; print}'
która opiera się na odpowiedzi najlepszej do tej pory odpowiedzi, nie zachowuje formatowania.W związku z tym użyłbym następujących, a także pozwala na wyraźne selektywne kolumny na początku:
Zauważ, że każda spacja również się liczy dla kolumn, więc na przykład poniżej kolumny 1 i 3 są puste, 2 to INFO, a 4 to:
źródło
Jeśli chcesz sformatowanego tekstu, połącz swoje polecenia za pomocą echa i użyj $ 0, aby wydrukować ostatnie pole.
Przykład:
Wydruki:
źródło
Z powodu złej, najbardziej uprzywilejowanej odpowiedzi z 340 głosami, właśnie straciłem 5 minut życia! Czy ktoś wypróbował tę odpowiedź przed jej ponownym głosowaniem? Zupełnie nie. Kompletnie bezużyteczny.
Mam dziennik, w którym po 5 USD z adresem IP może być więcej tekstu lub brak tekstu. Potrzebuję wszystkiego, od adresu IP do końca linii, jeśli coś będzie po 5 USD. W moim przypadku jest to w rzeczywistości bez programu awk, a nie onkiner awk, więc awk musi rozwiązać problem. Kiedy próbuję usunąć pierwsze 4 pola przy użyciu najbardziej pozytywnej, ale całkowicie błędnej odpowiedzi:
wyrzuca złą i bezużyteczną odpowiedź (dodałem [..] w celu zademonstrowania):
Istnieją nawet sugestie, aby połączyć substrat z tą błędną odpowiedzią. Podobnie jak komplikacja jest poprawą.
Zamiast tego, jeśli kolumny mają stałą szerokość do momentu, gdy potrzebny jest punkt cięcia i awk, prawidłowa odpowiedź to:
co daje pożądaną wydajność:
źródło