剪切命令的「字段」由什麼構成?

剪切命令的「字段」由什麼構成?

例如,該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 也更擅長處理各種分隔字元。這裡它正在處理它們同時混合的地方TabsSpaces

$ 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這是一個很好的後備方案,因為根據一個或多個空白字元來劃分欄位。在很多情況下,這更自然一些,但您必須了解一些語法。若要根據以下方式列印第二個欄位:cutawkawk

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

相關內容