Answers:
术语“场”往往是与工具,如相关的时间cut
和awk
。如果您获取数据并使用特定字符将其分开,则字段将类似于包含列数据的值。通常,用于执行此操作的字符是Space。
但是,与大多数工具一样,它是可配置的。例如:
awk -F"," ...
-将以逗号分隔(即,)。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.
对于此开关,它只是告诉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。
根据POSIX的字段是由IFS
“ 输入字段分隔符(或内部字段分隔符) ”中的任何字符分隔的行的任何部分。此字段的默认值为空格,后跟水平制表符,后跟换行符。使用Bash,您可以运行printf '%q\n' "$IFS"
以查看其价值。
cut
,特别是不是由哪个问题提出的。
cut -d "$IFS"
也会出错,但是awk -F"[ \t\n]"
按预期方式工作
它取决于所讨论的实用程序,但对于cut
,“字段”从文本行的开头开始,并包括直到第一个选项卡的所有内容。第二个字段从第一个选项卡之后的字符开始,一直到下一个选项卡。以此类推,对于第三,第四,……在制表符之间,行首和制表符之间,或制表符和行尾之间的所有内容。
除非您使用“ -d”选项指定字段定界符:否则,您cut -d: -f2
将获得第一和第二个冒号(':')字符之间的所有内容。
其他实用程序具有不同的定义,但是制表符是常见的。awk
如果cut
过于严格,则是一个很好的后备方法,因为它awk
根据一个或多个空白字符来划分字段。在许多情况下,这自然一点,但是您必须了解一些语法。要根据以下内容打印第二个字段awk
:
awk '{print $2}'
sort
是一个欺骗我的人。我当前的sort
手册页为字段分隔符说了类似“从非空白到空白的过渡”的内容。由于某种原因,需要花一些时间才能sort
正确定义字段。join
显然使用“由空格分隔”字段,这是awk
默认情况下要执行的操作。
这个故事的寓意是要谨慎,如果您不知道,请尝试一下。
当您使用cut
命令时,它需要两个主要参数
-d:代表定界符
-f:代表要从输入文件中剪切的字段
Ex. cut - d "|" - f1, 2 input_filename
此处output
将由定界符“ |”分隔 并且它将仅从输入文件中剪切2个字段
如果文件中有以下几行
Alex|120000|Admin|1999
然后它会切两个字段
Alex|120000
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
很难弄清楚字段/关键字!尽管选项很容易出错,但join
in中的字段似乎与in中的相同。cut
join
echo '$IFS' | cat -vet
以查看默认值在中的外观shell
。