Próbuję usunąć pierwsze dwie kolumny (którymi nie jestem zainteresowany) z pliku dziennika DbgView. Nie mogę znaleźć przykładu, który drukuje od kolumny 3 do końca wiersza. Zauważ, że każda linia ma zmienną liczbę kolumn.
linux
shell
unix
multiple-columns
Amit G.
źródło
źródło
Odpowiedzi:
... lub prostsze rozwiązanie:
cut -f 3- INPUTFILE
po prostu dodaj właściwy separator (-d) i uzyskasz ten sam efekt.źródło
źródło
awk '{for(i=3;i<=NF;++i)printf $i""FS ; print ""}'
(printf
nie wydrukuje znaku nowej linii, podczas gdyprint ""
doda znak nowej linii po wydrukowaniu innych pól)echo $(seq 1 10) | awk '{for (i=3; i<=NF; i++) printf $i FS}'
, co daje:3 4 5 6 7 8 9 10
.rozwiązanie znalezione tutaj:
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/
źródło
Odpowiedź Jonathana Feinberga drukuje każde pole w oddzielnym wierszu. Możesz użyć
printf
do odbudowania rekordu do wyjścia w tym samym wierszu, ale możesz też po prostu przesunąć pola o skok w lewo.źródło
NF
nie jest dozwolona przez POSIX.NF
można go zmniejszyć.Uwaga: ta metoda pozostawi "puste miejsca" w polach 1, 2, 3, ale nie stanowi problemu, jeśli chcesz tylko spojrzeć na wynik.
źródło
1
oznacza? które słowo kluczowe powinienem wyszukiwaćawk
?{$1=$2=$3="";$0=$0;$1=$1}1
Jeśli chcesz wydrukować kolumny po trzeciej, na przykład w tym samym wierszu, możesz użyć:
Na przykład:
Wydrukuje:
Jak widać, odcinek wypłaty, nawet ze spacją, jest wyświetlany we właściwej linii.
źródło
A co z następującym wierszem:
Na podstawie sugestii @ ghostdog74. Mój powinien zachowywać się lepiej, gdy filtrujesz linie, tj .:
źródło
sed 's/\s\+//g'
To odcina to, co znajduje się przed danym polem nr., N i wypisuje całą resztę wiersza, łącznie z polem nr N i zachowując oryginalne odstępy (nie zmienia formatowania). Nie ma znaczenia, czy ciąg pola pojawia się również gdzie indziej w wierszu, co jest problemem z odpowiedzią daisaa.
Zdefiniuj funkcję:
I użyj tego w ten sposób:
Dane wyjściowe zachowują wszystko, w tym spacje końcowe
Działa dobrze w przypadku plików, w których „/ n” jest separatorem rekordów, więc nie ma znaku nowego wiersza w wierszach. Jeśli chcesz go używać z innymi separatorami rekordów, użyj:
na przykład. Działa dobrze z prawie wszystkimi plikami, o ile nie używają szesnastkowego znaku nr. 1 wewnątrz linii.
źródło
Następujące polecenie awk drukuje N ostatnich pól każdego wiersza, a na końcu wiersza drukuje znak nowego wiersza:
Znajdź poniżej przykład, który wymienia zawartość katalogu / usr / bin, a następnie przechowuje ostatnie 3 wiersze, a następnie wypisuje ostatnie 4 kolumny każdego wiersza przy użyciu awk:
źródło
Najpierw znajdź pozycję początku trzeciej kolumny. Za pomocą substr wypisujesz całą linię ($ 0) zaczynając od pozycji (w tym przypadku a) do końca linii.
źródło
Cóż, możesz łatwo osiągnąć ten sam efekt, używając wyrażenia regularnego. Zakładając, że separator jest spacją, wyglądałoby to tak:
źródło
awk '{ sub(/([^ ]+ +){2}/, ""); print }'
co dwa razy usuwa wzór.źródło
Rozwiązanie Perl:
Używane są następujące opcje wiersza polecenia:
-n
pętla wokół każdego wiersza pliku wejściowego, nie drukuj automatycznie każdego wiersza-l
usuwa nowe wiersze przed przetworzeniem i dodaje je później-a
tryb autosplit - dzielenie linii wejściowych na tablicę @F. Domyślnie dzielenie na białe znaki-e
wykonać kod perlasplice @F,0,2
czysto usuwa kolumny 0 i 1 z tablicy @Fjoin " ",@F
łączy elementy tablicy @F, używając spacji między każdym elementemJeśli plik wejściowy jest rozdzielany przecinkami, a nie spacjami, użyj
-F, -lane
Rozwiązanie w Pythonie:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file
źródło
Trochę późno tutaj, ale żadne z powyższych nie wydawało się działać. Spróbuj tego, używając printf, wstawia spacje między nimi. Zdecydowałem się nie mieć znaku nowej linii na końcu.
źródło
drukuje rekordy począwszy od czwartego pola do ostatniego pola w tej samej kolejności, w jakiej znajdowały się w oryginalnym pliku
źródło
W Bash możesz użyć następującej składni z parametrami pozycyjnymi:
Dowiedz się więcej: Obsługa parametrów pozycyjnych na stronie Bash Hackers Wiki
źródło
Jeśli chodzi tylko o zignorowanie pierwszych dwóch pól i jeśli nie chcesz spacji podczas maskowania tych pól (tak jak robią to niektóre z powyższych odpowiedzi):
źródło
Pierwsze dwie kolumny są wyczyszczone,
sed
usuwa spacje wiodące.źródło
W kolumnach AWK nazywane są polami, stąd kluczem jest NF
wszystkie rzędy:
tylko pierwszy rząd:
źródło