Odpowiedzi:
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 -F"," ...- oddzieliłby się przecinkami (tj ,.).cut -d"," ...- rozdzieliłby przecinki (tj ,.).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.
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.
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.
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ść.
cutktóre pytanie zostało zadane.
cut -d "$IFS"wystąpi błąd, podczas gdy awk -F"[ \t\n]"działa zgodnie z oczekiwaniami
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.
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
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
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ć.
echo '$IFS' | cat -vetjak wygląda wartość domyślna wshell.