你如何使用-z选项“cut”命令?

时间:2016-10-02 16:35:34

标签: unix cut

在文档中,它说-z选项将默认行分隔符(换行符)更改为ASCII NUL。你究竟如何使用该选项?请看一下这个例子(文件以制表符分隔):

$ cat data.tsv 
John Doe    28  New York
Bob Smith   37  Boston
Jane Doe    31  Boston
$
$ cut -f1,3 data.tsv 
John Doe    New York
Bob Smith   Boston
Jane Doe    Boston
$
$ # This is the output I get:
$ cut -f1,3 -z data.tsv 
John Doe    New York
Bob Smith$

我无法理解那个输出。究竟是怎么回事?

2 个答案:

答案 0 :(得分:2)

-z适用于输入以NUL分隔而非\n - 分隔的情况。它改变cut处理输入的方式,并使其以相同的格式输出记录,并以\0行结尾。

您的输入数据现在是:

John Doe    28  New York\nBob Smith   37  Boston\nJane Doe    31  Boston\n

如果它有NUL而不是换行符,则您使用-z

John Doe    28  New York\0Bob Smith   37  Boston\0Jane Doe    31  Boston\0

这什么时候有用?对于文件而言,它不像管道那样多。例如,您可以使用find -print0在每个名称后面输出\0的文件名。 find -print0允许您使用嵌入的换行符处理文件名 - 这是非常不寻常的,但换行符是文件名中的合法字符。 \0永远不合法。

然后cut -z会很有用。

其他命令中的类似标志包括xargs -0read -d ''cpio -0

答案 1 :(得分:1)

ASCII NULL字符实际上是文件结尾。您的输入文件实际上包含:

John Doe\t28\tNew York\n
Bob Smith\t37\tBoston\n
Jane Doe\t31\tBoston\n
\0

\n是新行,\0是ASCII NULL\t是标签符。)

如果你的行分隔符是文件结尾,那么第一个字段将是“John Doe”(这是你所期望的),第三个字段是“New York\nBob Smith”。此处\n不是字段分隔符,因此该字段会运行到下一个标签。