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


16

例如,该cut命令可以使用参数-f,根据man

仅选择这些字段;除非指定-s选项,否则还会打印任何不包含定界符的行

在这种情况下,什么是字段?

Answers:


19

术语“场”往往是与工具,如相关的时间cutawk。如果您获取数据并使用特定字符将其分开,则字段将类似于包含列数据的值。通常,用于执行此操作的字符是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


8

根据POSIX的字段是由IFS输入字段分隔符(或内部字段分隔符 ”中的任何字符分隔的行的任何部分字段的默认值为空格,后跟水平制表符,后跟换行符。使用Bash,您可以运行printf '%q\n' "$IFS"以查看其价值。


进行操作echo '$IFS' | cat -vet 以查看默认值在中的外观shell
C0deDaedalus

1
Shell将IFS用于大多数目的(不是全部),但其他程序则不使用cut,特别是不是由哪个问题提出的。
dave_thompson_085 '18

与awk不同,cut一次也仅支持一个定界符,因此cut -d "$IFS"也会出错,但是awk -F"[ \t\n]"按预期方式工作
JGurtz

2

它取决于所讨论的实用程序,但对于cut,“字段”从文本行的开头开始,并包括直到第一个选项卡的所有内容。第二个字段从第一个选项卡之后的字符开始,一直到下一个选项卡。以此类推,对于第三,第四,……在制表符之间,行首和制表符之间,或制表符和行尾之间的所有内容。

除非您使用“ -d”选项指定字段定界符:否则,您cut -d: -f2将获得第一和第二个冒号(':')字符之间的所有内容。

其他实用程序具有不同的定义,但是制表符是常见的。awk如果cut过于严格,则是一个很好的后备方法,因为它awk根据一个或多个空白字符来划分字段。在许多情况下,这自然一点,但是您必须了解一些语法。要根据以下内容打印第二个字段awk

awk '{print $2}'

sort是一个欺骗我的人。我当前的sort手册页为字段分隔符说了类似“从非空白到空白的过渡”的内容。由于某种原因,需要花一些时间才能sort正确定义字段。join显然使用“由空格分隔”字段,这是awk默认情况下要执行的操作。

这个故事的寓意是要谨慎,如果您不知道,请尝试一下。


2

术语“字段”通常与linux无关,而是与特定程序有关。因此cut使用的字段与字段不同sort

使用cut,您可以通过使用-d选项指定字段分隔符来定义字段,该分隔符将每行中的字段分隔开。

如果您的数据在行中用冒号分隔,则可以合并-d-f获取字段(或列)2、3和6,如下所示:

echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6

1

当您使用cut命令时,它需要两个主要参数

-d:代表定界符

-f:代表要从输入文件中剪切的字段

Ex. cut - d "|"  - f1, 2 input_filename

此处output将由定界符“ |”分隔 并且它将仅从输入文件中剪切2个字段

如果文件中有以下几行

Alex|120000|Admin|1999

然后它会切两个字段

Alex|120000

您的示例由于空格不正确而被完全破坏,即使正确,这也无法对4年前给出的答案有所帮助。
dave_thompson_085 '18

0

cut对于分隔符是单个字符并且您想要以相同顺序输出输入字段的子集的简单情况非常有用(即使我指定-f3,2,1,它的作用也与相同-f1,2,3)。

awk单一行更加灵活,例如,当输入字段分隔符可以是任何空格(awk默认值)时,或者您要以不同顺序或特定格式输出字段时。

例如wc -l myfile | awk '{print $1}'ls -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}'非常简单,但是很难做到cut

我同意较早的海报,sort很难弄清楚字段/关键字!尽管选项很容易出错,但joinin中的字段似乎与in中的相同。cutjoin

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.