Potrzebuję pomocy, aby dowiedzieć się, jak użyć polecenia sed, aby wyświetlić tylko pierwszą kolumnę i ostatnią kolumnę w pliku tekstowym. Oto, co do tej pory mam dla kolumny 1:
cat logfile | sed 's/\|/ /'|awk '{print $1}'
Moja słaba próba pokazania ostatniej kolumny również:
cat logfile | sed 's/\|/ /'|awk '{print $1}{print $8}'
Jednak to bierze pierwszą kolumnę i ostatnią kolumnę i łączy je razem w jedną listę. Czy istnieje sposób na wyraźne wydrukowanie pierwszej kolumny i ostatnich kolumn za pomocą poleceń sed i awk?
Przykładowe dane wejściowe:
foo|dog|cat|mouse|lion|ox|tiger|bar
Odpowiedzi:
Prawie na miejscu. Po prostu umieść oba odniesienia do kolumn obok siebie.
Pamiętaj też, że nie potrzebujesz
cat
tutaj.Zauważ też, że możesz powiedzieć,
awk
że separatory kolumn są|
zamiast pustych, więc nie potrzebujeszsed
żadnego z nich.Zgodnie z sugestiami przez Kaleba , jeśli chcesz rozwiązania, które nadal wyprowadza ostatnie pole, nawet jeśli nie są dokładnie osiem, można użyć
$NF
.Ponadto, jeśli chcesz, aby wyjście zachowało
|
separatory, zamiast spacji, możesz określić separatory pól wyjściowych. Niestety jest to nieco bardziej niezręczne niż używanie-F
flagi, ale oto trzy podejścia.Możesz przypisać separatory pól wejściowych i wyjściowych w
awk
sobie, w bloku BEGIN.Możesz przypisać te zmienne podczas wywoływania
awk
z linii poleceń, poprzez-v
flagę.lub po prostu:
źródło
|
jako separatora wyjściowego zamiast domyślnej przestrzeni do łączenia łańcuchów. Możesz także wyjaśnić, jak używać$NF
zamiast kodowania$8
na stałe, aby uzyskać ostatnią kolumnę.Po prostu zamień od pierwszego do ostatniego
|
na|
(lub spację, jeśli wolisz):Zauważ, że chociaż nie ma
sed
implementacji, która|
jest wyjątkowa (o ile rozszerzone wyrażenia regularne nie są włączane za pośrednictwem-E
lub-r
w niektórych implementacjach),\|
sama jest wyjątkowa w niektórych takich jak GNUsed
. Więc powinien nie uciec|
, jeśli zamierzają go dopasować|
charakter.Jeśli zastąpisz spacją i jeśli dane wejściowe mogą już zawierać wiersze z jednym
|
, wtedy będziesz musiał potraktować to specjalnie, ponieważ|.*|
nie będzie pasować do nich. To mogłoby być:(to znaczy, że
.*|
część jest opcjonalna) Lub:lub:
Jeśli chcesz pierwsze i ósme pole niezależnie od liczby pól w danych wejściowych, to po prostu:
(wszystkie te działałyby z dowolnym narzędziem zgodnym z POSIX, zakładając, że dane wejściowe tworzą poprawny tekst (w szczególności
sed
te nie będą działać, jeśli dane wejściowe zawierają bajty lub sekwencje bajtów, które nie tworzą prawidłowych znaków w bieżącym języku, na przykładprintf 'unix|St\351phane|Chazelas\n' | sed 's/|.*|/|/'
w ustawienia regionalne UTF-8)).źródło
Tak czy
awk
inaczej używasz :źródło
|
, że to raczej spacja) za pomocą-F\|
lub podobnego? A co, jeśli chciałby użyć tego samego separatora dla danych wyjściowych?Jeśli czujesz się nieswojo i bez sedna, możesz osiągnąć to samo z Coreutils:
źródło
cut
jest czystszy i bardziej kompaktowy niż awk / sed, gdy interesuje Cię tylko pierwsza kolumna lub jeśli ograniczniki są stałe (tj. nie zmienna liczba spacji).Wygląda na to, że próbujesz uzyskać pierwsze i ostatnie pola tekstu, które są oddzielone
|
.Zakładam, że twój plik dziennika zawiera tekst jak poniżej,
I chcesz, aby wynik był jak
Jeśli tak, oto polecenie dla twojego
Poprzez GNU sed,
Przykład:
źródło
Prawdopodobnie powinieneś to zrobić
sed
- i tak bym to zrobił - ale dlatego, że nikt jeszcze tego nie napisał:WYDAJNOŚĆ
źródło