Próbuję wyodrębnić pewne (czwarte) pole ze strumienia tekstu opartego na kolumnach, dostosowanego do miejsca. Próbuję użyć cut
polecenia w następujący sposób:
cat text.txt | cut -d " " -f 4
Niestety cut
nie traktuje kilku spacji jako jednego separatora. Mógłbym przepuścić przez awk
awk '{ printf $4; }'
lub sed
sed -E "s/[[:space:]]+/ /g"
zwinąć przestrzenie, ale chciałbym wiedzieć, czy jest jakiś sposób na radzenie sobie cut
i kilku separatorów natywnie?
Odpowiedzi:
Próbować:
Ze strony podręcznika
tr
:źródło
cat
tu potrzeby . Możesz przejść< text.txt
bezpośrednio dotr
. en.wikipedia.org/wiki/Cat_%28Unix%29#Useless_use_of_cat-d
i tłumaczyć bezpośrednio z wielu znaków na tabulator. Na przykład: przyszedłem tutaj, aby znaleźć sposób na automatyczne wyeksportowanie mojego wyświetlacza:who am i | tr -s ' ()' '\t' | cut -f5
echo "a b c" | cut -d " " -f2-
,echo "a b c" | tr -s " " | cut -d " " -f2-
Jak komentujesz w swoim pytaniu,
awk
jest to naprawdę droga. Używaniecut
jest możliwe razem ztr -s
wyciskaniem spacji, jak pokazuje odpowiedź Kev .Pozwól mi jednak przejść przez wszystkie możliwe kombinacje dla przyszłych czytelników. Objaśnienia znajdują się w części Test.
tr | skaleczenie
awk
grzmotnąć
sed
Testy
Biorąc pod uwagę ten plik, przetestujmy polecenia:
tr | skaleczenie
awk
grzmotnąć
To odczytuje pola sekwencyjnie. Używając
_
tego, wskazujemy, że jest to zmienna jednorazowa jako „zmienna śmieciowa”, aby zignorować te pola. W ten sposób przechowujemy$myfield
jako czwarte pole w pliku, bez względu na odstępy między nimi.sed
Przechwytuje trzy grupy spacji i nie ma spacji z
([^ ]*[ ]*){3}
. Następnie łapie wszystko, co nadchodzi, do spacji jako czwartego pola, na którym jest w końcu drukowane\1
.źródło
awk
jest nie tylko elegancki i prosty, ale także zawarty w VMware ESXi, w którym gotr
brakuje.awk
!read
poleceniu, jeśli nie obchodzi nas, co się w nim dzieje . Może być cokolwiek, tylko że w jakiś sposób stało się standardem zamiastjunk_var
lubwhatever
:)najkrótsze / najbardziej przyjazne rozwiązanie
Po sfrustrowaniu zbyt wieloma ograniczeniami
cut
, napisałem własny zamiennik, który wezwałemcuts
do „zmniejszenia sterydów”.cięcia zapewnia najbardziej minimalistyczne rozwiązanie tego i wielu innych powiązanych problemów z wycinaniem / wklejaniem.
Jednym z wielu przykładów jest odpowiedź na to pytanie:
cuts
obsługuje:paste
osobno)i wiele więcej. Żaden z nich nie jest dostarczany standardowo
cut
.Zobacz też: https://stackoverflow.com/a/24543231/1296044
Źródło i dokumentacja (darmowe oprogramowanie): http://arielf.github.io/cuts/
źródło
Ten linijka Perla pokazuje, jak blisko Perl jest powiązany z awk:
Jednak
@F
tablica autosplit zaczyna się od indeksu,$F[0]
a pola awk zaczynają się od$1
źródło
W wersjach, o
cut
których wiem, nie, nie jest to możliwe.cut
jest przede wszystkim przydatny do analizowania plików, w których separator nie jest spacją (na przykład/etc/passwd
) i które mają stałą liczbę pól. Dwa separatory w rzędzie oznaczają puste pole, i dotyczy to również białych znaków.źródło