Na przykład cut
polecenie 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?
Termin „pole” jest często kojarzony z narzędziami takimi jak cut
i 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 awk
automatycznie podzieli się na spacje.
$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.
Ten pokazuje, jak cut
rozdzieli 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 cut
do 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, cut
aby nie drukować żadnych wierszy, które nie zawierają znaku ogranicznika określonego za pomocą -d
przełą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 cut
pomocą -s
przełą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 -s
przełą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ść.
echo '$IFS' | cat -vet
jak wygląda wartość domyślna wshell
.cut
które pytanie zostało zadane.cut -d "$IFS"
wystąpi błąd, podczas gdyawk -F"[ \t\n]"
działa zgodnie z oczekiwaniamiZależ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: -f2
dostaniesz wszystko między pierwszym a drugim znakiem dwukropka („:”).Inne narzędzia mają różne definicje, ale znak tabulacji jest powszechny.
awk
jest dobrą rezerwą, jeślicut
jest zbyt surowa, ponieważawk
dzieli 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 zawk
:sort
to ten, który mnie oszukuje. Moja bieżącasort
strona podręcznika mówi coś w rodzaju „przejście niepuste na puste” dla separatora pól. Z jakiegoś powodusort
poprawne zdefiniowanie pól zajmuje kilka prób .join
najwyraźniej używa pól „rozdzielonych białymi spacjami”, coawk
domyślnie ma być wykonane.Morał tej historii jest ostrożny i eksperymentuj, jeśli nie wiesz.
źródło
Termin „pole” nie jest ogólnie związany z linuksem, ale z konkretnymi programami.
cut
Używa więc innego rodzaju pola niżsort
.Za pomocą
cut
definiujesz, 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ć
-d
i-f
uzyskać pola (lub kolumny) 2, 3 i 6 w następujący sposób:źródło
Kiedy używasz
cut
polecenia, to bierze on dwa główne argumentyTutaj
output
byłyby oddzielone ogranicznikiem „|” i wycina tylko 2 pola z pliku wejściowegoJeśli masz w pliku następujące wiersze
Następnie wycina 2 pola, które są
źródło
cut
jest ś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
).awk
jednowierszowe są znacznie bardziej elastyczne, np. gdy separatorem pól wejściowych może być dowolna biała spacja (awk
ustawienie 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}'
lubls -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}'
są bardzo proste, ale byłoby to trudnecut
.Zgadzam się z wcześniejszymi plakatami, że pola / klucze
sort
są trudne do rozgryzienia!join
Wydaje się, że pola w działają tak samo jak wcut
, chociażjoin
łatwo się pomylić.źródło