Co stanowi „pole” dla polecenia cięcia?


16

Na przykład cutpolecenie może przyjąć parametr -f, który zgodnie zman

wybierz tylko te pola; wypisz również dowolny wiersz, który nie zawiera znaku ogranicznika, chyba że podano opcję -s

W tym kontekście czym jest pole?

Odpowiedzi:


19

Termin „pole” jest często kojarzony z narzędziami takimi jak cuti awk. Pole byłoby podobne do danych o wartości kolumnowej, jeśli weźmiesz dane i rozdzielisz je za pomocą określonego znaku. Zazwyczaj używana do tego postać to Space.

Jednak jak w przypadku większości narzędzi, można go konfigurować. Na przykład:

  • awk = awk -F"," ...- oddzieliłby się przecinkami (tj ,.).
  • cut = cut -d"," ...- rozdzieliłby przecinki (tj ,.).

Przykłady

Ten pierwszy pokazuje, jak awkautomatycznie podzieli się na spacje.

$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.

Ten pokazuje, jak cutrozdzieli się również na spacje.

$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.

Tutaj mamy listę CSV danych kolumn, których używamy cutdo zwracania kolumn 1 i 4.

$ echo "col1,col2,col3,co4" | cut -d"," -f1,4
col1,co4

Awk też może to zrobić:

$ echo "col1,col2,col3,co4" | awk -F"," '{print $1","$4}'
col1,co4

Awk jest również nieco bardziej biegły w radzeniu sobie z różnymi postaciami separacji. Tu do czynienia z Tabswraz z Spacesktórym są one między mieszane jednocześnie:

$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.

Co z przełącznikiem -s na cięcie?

W odniesieniu do tego przełącznika, po prostu mówi, cutaby nie drukować żadnych wierszy, które nie zawierają znaku ogranicznika określonego za pomocą -dprzełącznika.

Przykład

Powiedzmy, że mieliśmy ten plik.

$ cat sample.txt 
This is a space string.
This is a space   and   tab string.
Thisstringcontainsneither.

UWAGA: W drugim ciągu powyżej znajdują się spacje i tabulatory.

Teraz, gdy przetwarzamy te ciągi za cutpomocą -sprzełącznika i bez niego :

$ cut -d" " -f1-6 sample.txt 
This is a space string.
This is a space  
Thisstringcontainsneither.

$ cut -d" " -f1-6 -s sample.txt 
This is a space string.
This is a space  

W 2. przykładzie widać, że -sprzełącznik został pominięty strun z wyjścia, które nie zawierają ogranicznika, Space.


8

Pole zgodne z POSIX jest dowolną częścią linii ograniczoną dowolnym ze znaków IFS, „ separatorem pól wejściowych (lub wewnętrznym separatorem pól ) ”. Domyślną wartością jest spacja, następnie tabulator poziomy, a następnie nowa linia . Dzięki Bash możesz uruchomić, printf '%q\n' "$IFS"aby zobaczyć jego wartość.


Sprawdź, echo '$IFS' | cat -vet jak wygląda wartość domyślna w shell.
C0deDaedalus

1
IFS jest używany przez powłokę do większości celów (nie wszystkich), ale nie przez inne programy, a konkretnie nie przez to, o cutktóre pytanie zostało zadane.
dave_thompson_085

W przeciwieństwie do awk, cut obsługuje również tylko jeden ogranicznik na raz, więc cut -d "$IFS"wystąpi błąd, podczas gdy awk -F"[ \t\n]"działa zgodnie z oczekiwaniami
JGurtz

2

Zależy to od danego narzędzia, ale cut„pole” zaczyna się na początku wiersza tekstu i zawiera wszystko aż do pierwszej karty. Drugie pole biegnie od znaku po pierwszej karcie do następnej karty. I tak dalej, po trzecie, czwarte ... Wszystko między tabulatorami lub między początkiem linii a tabulatorem lub między tabulatorem a końcem linii.

O ile nie określisz ogranicznika pola za pomocą opcji „-d”: cut -d: -f2dostaniesz wszystko między pierwszym a drugim znakiem dwukropka („:”).

Inne narzędzia mają różne definicje, ale znak tabulacji jest powszechny. awkjest dobrą rezerwą, jeśli cutjest zbyt surowa, ponieważ awkdzieli pola na podstawie jednej lub więcej białych znaków. Jest to trochę bardziej naturalne w wielu sytuacjach, ale musisz znać trochę składni. Aby wydrukować drugie pole zgodnie z awk:

awk '{print $2}'

sortto ten, który mnie oszukuje. Moja bieżąca sortstrona podręcznika mówi coś w rodzaju „przejście niepuste na puste” dla separatora pól. Z jakiegoś powodu sortpoprawne zdefiniowanie pól zajmuje kilka prób . joinnajwyraźniej używa pól „rozdzielonych białymi spacjami”, co awkdomyślnie ma być wykonane.

Morał tej historii jest ostrożny i eksperymentuj, jeśli nie wiesz.


2

Termin „pole” nie jest ogólnie związany z linuksem, ale z konkretnymi programami. cutUżywa więc innego rodzaju pola niż sort.

Za pomocą cutdefiniujesz, co jest polem, określając ogranicznik pola opcją -d, która oddziela pola w każdej linii.

Jeśli Twoje dane są oddzielone dwukropkami w wierszach, możesz łączyć -di -fuzyskać pola (lub kolumny) 2, 3 i 6 w następujący sposób:

echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6

1

Kiedy używasz cutpolecenia, to bierze on dwa główne argumenty

-d: co oznacza separator

-f: co oznacza pole do wycięcia z pliku wejściowego

Ex. cut - d "|"  - f1, 2 input_filename

Tutaj outputbyłyby oddzielone ogranicznikiem „|” i wycina tylko 2 pola z pliku wejściowego

Jeśli masz w pliku następujące wiersze

Alex|120000|Admin|1999

Następnie wycina 2 pola, które są

Alex|120000

Twój przykład jest całkowicie zepsuty z powodu niepoprawnych spacji, a nawet jeśli jest poprawny, nic nie dodaje do odpowiedzi udzielonych 4 lata temu.
dave_thompson_085

0

cutjest świetny do prostych przypadków, w których ogranicznik jest pojedynczym znakiem i chcesz wypisać podzbiór pól wejściowych, w tej samej kolejności (nawet jeśli podam -f3,2,1, działa tak samo jak -f1,2,3).

awkjednowierszowe są znacznie bardziej elastyczne, np. gdy separatorem pól wejściowych może być dowolna biała spacja ( awkustawienie domyślne) lub gdy chcesz wyprowadzać pola w innej kolejności lub w określonym formacie.

Na przykład wc -l myfile | awk '{print $1}'lub ls -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}'są bardzo proste, ale byłoby to trudne cut.

Zgadzam się z wcześniejszymi plakatami, że pola / klucze sortsą trudne do rozgryzienia! joinWydaje się, że pola w działają tak samo jak w cut, chociaż joinłatwo się pomylić.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.