Chcę usunąć ostatnią kolumnę pliku txt, a nie wiem, jaki jest numer kolumny. Jak mogłem to zrobić?
Przykład:
Wkład:
1223 1234 1323 ... 2222 123
1233 1234 1233 ... 3444 125
0000 5553 3455 ... 2334 222
Chcę, aby mój wynik był:
1223 1234 1323 ... 2222
1233 1234 1233 ... 3444
0000 5553 3455 ... 2334
text-processing
sed
awk
perl
zara
źródło
źródło
Odpowiedzi:
Z
awk
:lub:
lub:
Chociaż wygląda to jak voodoo, działa. Każda z tych komend awk składa się z trzech części.
Pierwsza to
NF
warunek wstępny drugiej części.NF
jest zmienną zawierającą liczbę pól w linii. W AWK rzeczy są prawdziwe, jeśli nie są 0 lub pusty ciąg""
. Dlatego druga część (gdzieNF
jest zmniejszana) dzieje się tylko wtedy, gdyNF
nie jest równa 0.Druga część (albo
NF-=1
NF--
albo--NF
) odejmuje jedną odNF
zmiennej. Zapobiega to drukowaniu ostatniego pola, ponieważ podczas zmiany pola (w tym przypadku usuwając ostatnie pole),awk
ponownie konstruuj$0
, łącz wszystkie domyślnie pola oddzielone spacją.$0
nie zawierał już ostatniego pola.Ostatnia część to
1
. To nie jest magiczne, jest po prostu używane jako wyrażenie, które oznaczatrue
. Jeśliawk
wyrażenie ma wartość true bez powiązanej akcji,awk
domyślną akcją jestprint $0
.źródło
--
. Uwaga: obecnie potrzebujesz;1
zgodności z POSIX.,
Twoim ogranicznikiem jest:awk -F',' 'BEGIN { OFS = FS }; NF { NF -= 1 }; 1' < in > out
Korzystanie
grep
z PCRE:Za pomocą GNU
sed
:źródło
Za pomocą Perla:
Używanie
rev
+cut
:źródło
Za pomocą GNU sed:
Mówiąc bardziej ogólnie, ten działa z sedem BSD w OSX, a także GNU sed:
źródło
Jeśli separator jest zawsze pojedynczym znakiem (więc dwa lub więcej kolejnych separatorów oznacza puste pola), możesz
head
po prostu pierwszy wiersz z pliku wejściowego, policzyć separatory (n
separatory oznaczają liczbę póln+1
), a następnie użyćcut
do wydrukowania z1
pola st don
pola th (od drugiego do ostatniego), np. z wprowadzeniem rozdzielanym tabulatorami:lub np. z plikiem csv :
Uruchomię kilka testów porównawczych później, jeśli będę miał czas, ale przy dużym wkładzie myślę, że to rozwiązanie powinno być szybsze niż inne rozwiązania, które używają wyrażenia regularnego, ponieważ to robi minimalne przetwarzanie w pierwszej linii, aby uzyskać nie. pól, a następnie zastosowań
cut
zoptymalizowanych do tego zadania.źródło
Przenośnie możesz użyć jednego z tych:
źródło
Korzystanie z vima:
Otwórz plik w vimie
Przejdź do pierwszego rzędu, na wypadek, gdyby kursor został umieszczony gdzie indziej.
Utwórz makro o nazwie „q”
qq
, które przechodzi na koniec bieżącej linii$
, a następnie wraca do ostatniej spacjiF
( duża litera F, a następnie dosłowna SPACJA), następnie usuwa z bieżącej pozycji do końca linii iD
przechodzi do następnej liniij
i zatrzymać nagrywanie makra za pomocąq
.Teraz możemy powtórzyć nasze makro
@q
dla każdego wiersza.Możemy również nacisnąć,
@@
aby powtórzyć ostatnie makro lub nawet łatwiej:powtórzyć makro 99 razy.
Uwaga: Liczba nie może dokładnie odpowiadać wierszom.
źródło
W przypadku osób, które mają podobny problem, ale z różnymi separatorami pól, ta
awk
metoda zachowa poprawnie separator pól:źródło