
例如,該cut
命令可以帶參數 -f,根據man
僅選擇這些欄位;也列印任何不包含分隔符號的行,除非指定了 -s 選項
在這種情況下,什麼是字段?
答案1
術語「字段」通常與諸如cut
和 之類的工具相關聯awk
。如果您獲取資料並使用特定字元將其分隔,那麼欄位將類似於一列資料。通常用於執行此操作的字元是Space。
然而,與大多數工具一樣,它是可配置的。例如:
- awk =
awk -F"," ...
- 將以逗號分隔(即,)。 - cut =
cut -d"," ...
- 將以逗號分隔(即,)。
例子
第一個展示如何awk
自動分割空格。
$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.
這cut
也顯示瞭如何在空間上進行分割。
$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.
這裡我們有一個列資料的 CSV 列表,我們用它cut
來返回第 1 列和第 4 列。
$ echo "col1,col2,col3,co4" | cut -d"," -f1,4
col1,co4
awk 也可以做到這一點:
$ echo "col1,col2,col3,co4" | awk -F"," '{print $1","$4}'
col1,co4
awk 也更擅長處理各種分隔字元。這裡它正在處理它們同時混合的地方Tabs:Spaces
$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.
那麼要剪切的 -s 開關呢?
對於此開關,它只是告訴cut
不要列印任何不包含透過-d
開關指定的分隔符的行。
例子
假設我們有這個文件。
$ cat sample.txt
This is a space string.
This is a space and tab string.
Thisstringcontainsneither.
筆記:上面第二個字串中有空格和製表符。
cut
現在,當我們使用帶開關和不帶開關來處理這些字串時-s
:
$ 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
在第二個範例中,您可以看到-s
開關省略了輸出中不包含分隔符號 的任何字串Space。
答案2
根據 POSIX,欄位是由以下任何字元分隔的行的任何部分IFS
, 這 ”輸入欄位分隔符(或者內部欄位分隔符)。" 它的預設值是空格,後面跟著一個水平製表符,然後是換行符。使用 Bash,您可以運行printf '%q\n' "$IFS"
來查看它的值。
答案3
這取決於所討論的實用程序,但對於cut
,「欄位」從一行文字的開頭開始,並包括直到第一個選項卡的所有內容。第二個欄位從第一個選項卡之後的字元開始,直到下一個選項卡。依此類推,第三個、第四個…製表符之間、行首和製表符之間、製表符和行尾之間的所有內容。
除非您使用“-d”選項指定欄位分隔符號:cut -d: -f2
將獲得第一個和第二個冒號(':')字元之間的所有內容。
其他實用程式有不同的定義,但製表符是常見的。如果過於嚴格,awk
這是一個很好的後備方案,因為根據一個或多個空白字元來劃分欄位。在很多情況下,這更自然一些,但您必須了解一些語法。若要根據以下方式列印第二個欄位:cut
awk
awk
awk '{print $2}'
sort
是那個欺騙我的人。我目前的sort
手冊頁顯示字段分隔符號的“非空白到空白轉換”之類的內容。由於某種原因,需要多次嘗試才能sort
正確定義欄位。join
顯然使用“由空格分隔”字段,這就是awk
預設要做的事情。
這個故事的寓意是要小心,如果你不知道就進行實驗。
答案4
當您使用cut
命令時,它需要兩個主要參數
-d :代表分隔符
-f :代表要從輸入檔案中剪切的字段
Ex. cut - d "|" - f1, 2 input_filename
這裡output
將以分隔符號“|”分隔它只會從輸入檔中刪除 2 個字段
如果您的文件中有以下幾行
Alex|120000|Admin|1999
然後它會剪切 2 個字段,分別是
Alex|120000