Odpowiedzi:
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ść.
cut
któ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: -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śli cut
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 z awk
:
awk '{print $2}'
sort
to ten, który mnie oszukuje. Moja bieżąca sort
strona podręcznika mówi coś w rodzaju „przejście niepuste na puste” dla separatora pól. Z jakiegoś powodu sort
poprawne zdefiniowanie pól zajmuje kilka prób . join
najwyraźniej używa pól „rozdzielonych białymi spacjami”, co awk
domyś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. 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:
echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6
Kiedy używasz cut
polecenia, 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 output
był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
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}'
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 sort
są trudne do rozgryzienia! join
Wydaje się, że pola w działają tak samo jak w cut
, chociaż join
łatwo się pomylić.
echo '$IFS' | cat -vet
jak wygląda wartość domyślna wshell
.