2012-12-03 13 views

Odpowiedz

58

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".

+0

'6-6' prawdopodobnie działa, ale jest bardziej konwencjonalnie zapisana jako' 6'. –

+0

@ 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

11

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.

+0

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? –

9

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- 
0

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]"' 
Powiązane problemy