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