podane wejściepomocą polecenia Wytnij, aby usunąć wiele kolumn
echo 1,2,3,4,5,6,7,8,9,...100
Jeśli chcę wyciąć kolumnach 5 mogę zrobić
cut -d, -f-4,6-
co jeśli chcę wyciąć kilka non kolejne kolumny jak 5, 7 , itp. czy istnieje jeden liniowiec?
podane wejściepomocą polecenia Wytnij, aby usunąć wiele kolumn
echo 1,2,3,4,5,6,7,8,9,...100
Jeśli chcę wyciąć kolumnach 5 mogę zrobić
cut -d, -f-4,6-
co jeśli chcę wyciąć kilka non kolejne kolumny jak 5, 7 , itp. czy istnieje jeden liniowiec?
Powinieneś być w stanie kontynuować sekwencje bezpośrednio w swojej istniejącej specyfikacji -f
.
Aby pominąć zarówno 5 i 7, spróbuj:
cut -d, -f-4,6-6,8-
jak jesteś omijając jedną sekwencyjną kolumny, może to również być zapisany jako:
cut -d, -f-4,6,8-
Aby zachować to będzie, jeśli chciał pominąć 5, 7 i 11, należy użyć:
cut -d, -f-4,6-6,8-10,12-
aby umieścić go w bardziej jasnego widzenia, łatwiej jest wizualizować podczas korzystania z kolumn początkowych/końcowych, które znajdują się odpowiednio na początku/końcu listy sekwencji. Na przykład, co następuje wypisze kolumnach 2 do 20, omijając kolumnach 5 i 11:
cut -d, -f2-4,6-10,12-20
Tak, będzie to wydrukować "2 do 4", pomiń 5 "6 do 10", pomiń 11, a następnie "12 do 20".
Jesteś w stanie wyciąć wszystkie parzyste/nieparzyste kolumny przez korzystających z SEQ:
Byłoby to wydrukować wszystkie Odd kolumn
echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(seq -s, 1 2 10)
Aby wydrukować wszystkie nawet kolumny można użyć
echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(seq -s, 2 2 10)
Zmieniając drugą liczbę seq możesz określić, które kolumny mają zostać wydrukowane.
Jeśli specyfikacja które kolumny do drukowania jest bardziej złożona można też użyć „klauzuli jedno-liner-if-” jak
echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(for i in $(seq 1 10); do if [[ $i -lt 10 && $i -lt 5 ]];then echo -n $i,; else echo -n $i;fi;done)
Byłoby to wydrukować wszystkie kolumny od 1 do 5 - wystarczy zmodyfikować warunki tworzenia bardziej złożonych warunków dla określenia pogody drukowana jest kolumna.
Używanie w Mac Os (Darwin): echo 1,2,3,4,5,6,7,8,9, 10 | cut -d, -f $ (seq -s, 1 2 10) Otrzymuję ten błąd przekrój: [-cf] list: wartości mogą nie zawierać zera , ale jeśli uruchomię: echo 1,2,3,4 5,6,7,8,9,10 | cut -d, -f1,3,5,7,9 błąd zniknął. Czy ktoś mógłby spróbować to wyjaśnić? Dlaczego, jeśli seq jest używany, pojawia się ten błąd? –
Czasami łatwiej jest myśleć w kategoriach, które pola należy wykluczyć.
Jeśli liczba pól, które nie zostały obcięte (które nie zostały zatrzymane na wyjściu) jest niewielka, łatwiejsze może być użycie flagi --complement
, np.Aby uwzględnić wszystkie pola 1-20 z wyjątkiem nie 3, 7, i 12 - w tym celu:
cut -d, --complement -f3,7,12 <inputfile
Zamiast
cut -d, -f-2,4-6,8-11,13-
To samo może być zrobione z Perl
Ponieważ używa 0- oparciu indeksowania zamiast 1-Based-indeksowania, wartości pól są przesunięte o 1
perl -F, -lane 'print join ",", @F[1..3,5..9,11..19]'
odpowiada:
cut -d, -f2-4,6-10,12-20
Jeśli przecinki nie są potrzebne na wyjściu:
perl -F, -lane 'print "@F[1..3,5..9,11..19]"'
'6-6' prawdopodobnie działa, ale jest bardziej konwencjonalnie zapisana jako' 6'. –
@ JonathanLeffler Tak, wiem - ale trzymałem "6-6" w tym przykładzie, pokazując, jak mogłoby wyglądać użycie szerszego zakresu kolumn. Na przykład, jeśli OP chce pominąć 5 i 10, będzie potrzebował "-f-4,6-9,11". To może (ale nie musi) być wizualizowane, jeśli zwinęłem je do "6". Zmodyfikuję jednak także przykład z kolumnami sekwencyjnymi - dlatego dziękuję za wskazówkę =] – newfurniturey