【问题标题】:Using cut command to remove multiple columns使用 cut 命令删除多列
【发布时间】:2012-11-21 08:15:59
【问题描述】:

给定输入

回声 1,2,3,4,5,6,7,8,9,...100

如果我想削减第 5 列,我可以做到

切-d,-f-4,6-

如果我想剪切多个不连续的列,如 5、7 等,该怎么办? 有一个班轮吗?

【问题讨论】:

    标签: bash cut


    【解决方案1】:

    您应该能够直接在现有的-f 规范中继续这些序列。

    要跳过 5 和 7,请尝试:

    cut -d, -f-4,6-6,8-
    

    当您跳过单个连续列时,这也可以写成:

    cut -d, -f-4,6,8-
    

    为了继续进行,如果您想跳过 5、7 和 11,您可以使用:

    cut -d, -f-4,6-6,8-10,12-
    

    为了更清楚地了解它,当您使用分别位于序列列表开头/结尾的开始/结束列时,更容易可视化。例如,以下将打印第 2 到 20 列,跳过第 5 和 11 列:

    cut -d, -f2-4,6-10,12-20
    

    因此,这将打印“2 到 4”,跳过 5,“6 到 10”,跳过 11,然后是“12 到 20”。

    【讨论】:

    • 6-6 可能有效,但通常写成6
    • @JonathanLeffler 是的,我知道 - 但我在示例中保留了 6-6,以展示使用更广泛的列会是什么样子。例如,如果 OP 想跳过 5 和 10,他需要-f-4,6-9,11-。如果我将其折叠为 6,这可能(或可能不会)可视化。但是,我也编辑添加了一个带有顺序列的示例 - 所以感谢您的提示 =]
    【解决方案2】:

    您可以使用 seq 剪切所有奇数/偶数列:

    这将打印所有奇数列

    echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(seq -s, 1 2 10)
    

    要打印您可以使用的所有偶数列

    echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(seq -s, 2 2 10)
    

    通过更改 seq 的第二个数字,您可以指定要打印的列。

    如果要打印的列的规范更复杂,您还可以使用“one-liner-if-clause”,如

    echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(for i in $(seq 1 10); do if [[ $i -lt 10 && $i -lt 5 ]];then echo -n $i,; else echo -n $i;fi;done)
    

    这将打印从 1 到 5 的所有列 - 您可以简单地修改条件以创建更复杂的条件来指定应打印列的天气。

    【讨论】:

    • 在 Mac Os (Darwin) 中使用:echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(seq -s, 1 2 10) 我得到这个错误 cut: [-cf] list: values may not include zero but if I run: echo 1,2,3,4,5,6 ,7,8,9,10 | cut -d, -f1,3,5,7,9 错误消失。有人可以尝试解释一下吗?为什么如果使用 seq 会出现这个错误?
    • 这比此页面上的所有其他答案都更复杂,更不灵活。
    【解决方案3】:

    有时更容易考虑排除哪些字段。

    如果未剪切(未保留在输出中)的字段数量很少,则使用--complement 标志可能更容易,例如包括除 3、7 和 12 以外的所有字段 1-20 -- 执行以下操作:

    cut -d, --complement -f3,7,12 <inputfile
    

    而不是

    cut -d, -f-2,4-6,8-11,13-
    

    【讨论】:

      【解决方案4】:

      Perl 也可以做到这一点
      因为它使用基于 0 的索引而不是基于 1 的索引,所以字段值偏移 1

      perl -F, -lane 'print join ",", @F[1..3,5..9,11..19]'    
      

      相当于:

      cut -d, -f2-4,6-10,12-20
      

      如果输出中不需要逗号:

      perl -F, -lane 'print "@F[1..3,5..9,11..19]"'
      

      【讨论】:

        猜你喜欢
        • 2012-09-22
        • 2013-07-29
        • 2015-05-28
        • 1970-01-01
        • 2013-02-05
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 2013-11-25
        相关资源
        最近更新 更多