【问题标题】:Select a particular column using awk or cut or perl使用 awk 或 cut 或 perl 选择特定列
【发布时间】:2012-11-27 12:38:27
【问题描述】:

我需要从制表符分隔的文件中选择第 7 列。例如:

cat filename | awk '{print $7}'

问题是第 4 列中的数据有多个值,中间有空格。示例 - 以下输出中的最后一行:

user  \Adminis FL_vol Design         0         -       1       -
group        0 FL_vol Design   19324481         -    3014       -
user      \MAK FL_vol Design   16875161         -    2618       -
tree       826 FL_vol Out Global Doc Mark     16875162         -    9618       - /vol/FL_vol/Out Global Doc Mark

【问题讨论】:

    标签: perl unix sed awk


    【解决方案1】:

    如果数据明确地以制表符分隔,则cut 将在制表符上剪切,而不是空格:

    cut -f7 filename
    

    您当然也可以使用 awk 做到这一点:

    awk -F'\t' '{ print $7 }'
    

    【讨论】:

      【解决方案2】:

      如果字段是用制表符分隔的,而你担心某些字段包含空格,这里没有问题,只是:

      cut -f 7
      

      (剪切默认为制表符分隔的字段。)

      【讨论】:

        【解决方案3】:

        从您输入文件的格式来看,您可以不用空格来分隔-

        awk 'BEGIN{FS="-"} {print $2}' filename
        
        • FS 代表字段分隔符,只需将其视为输入的分隔符。
        • 鉴于我们现在在 - 上划界,您之前的第 7 个字段现在变成了第 2 个字段。
        • Save a cat!将输入文件 filename 指定为 awk 的参数。

        或者,如果您的数据字段由制表符分隔,您可以更明确地执行以下操作:

        awk 'BEGIN{FS="\t"} {print $7}' filename
        

        这将解决问题,因为Out Global Doc Mark 看起来是用空格分隔的。

        【讨论】:

        • ...鞭打空间:awk 'BEGIN{FS="[ \t]*-[ \t]*"} {print $2}'
        • 有时第 5 列中有数字。它不必一直是“-”。也可以是第 4 列中的“-”。
        【解决方案4】:

        这可能对你有用(GNU sed):

        sed -r 's/(([^\t]*)\t?){7}.*/\2/' file
        

        此替代命令选择行中的所有内容并返回第 7 个非制表符。在sed 中,由(...) 分组的最后一项将通过使用反向引用在替换的左侧返回。在这种情况下,第一个反向引用将返回非制表符和制表符(如果存在,请注意 ? 元字符,其中一个或没有一个正在进行的模式)。.* 只是吞噬了什么如果有的话就留在线上。

        【讨论】:

        • @shgnInc 替代命令选择行中的所有内容并返回第 7 个非制表符。在 sed 中,由(...) 分组的最后一项将通过使用反向引用在替换的左侧返回。在这种情况下,第一个反向引用将返回非制表符和制表符(如果存在,请注意 ? 元字符,其中一个或没有前面的模式)。.* 只是吞噬了剩下的如果有的话。
        猜你喜欢
        • 2011-04-26
        • 2013-07-29
        • 2012-03-06
        • 2013-05-27
        • 2014-12-10
        • 1970-01-01
        • 1970-01-01
        • 2020-05-15
        • 2016-12-11
        相关资源
        最近更新 更多