剪切命令的“字段”由什么构成?

剪切命令的“字段”由什么构成?

例如,该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

相关内容