【问题标题】:How exacly do you use the -z option for the "cut" command?您究竟如何使用“cut”命令的 -z 选项?
【发布时间】:2016-10-02 16:35:33
【问题描述】:

在文档中它说-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$

我无法理解那个输出。到底发生了什么?

【问题讨论】:

    标签: unix cut


    【解决方案1】:

    -z 用于当您的 input 是 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 输出文件名,每个文件名后面都带有\0find -print0 允许您处理带有嵌入换行符的文件名——这是非常不寻常的,但换行符是文件名中的合法字符。 \0 绝不合法。

    那么cut -z 会很有用。

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

    【讨论】:

      【解决方案2】:

      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 不是此处的字段分隔符,因此该字段会一直运行到下一个选项卡。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-10
        • 1970-01-01
        • 1970-01-01
        • 2015-05-21
        • 2011-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多