使用cut命令删除多列

100

给定输入

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

如果我想要删除第5列,我可以使用:

cut -d, -f-4,6-

如果我想要删除多个不连续的列,例如第5列、第7列等,是否有一条命令可以完成?


答案:
可以使用以下命令来删除多个非连续列:
cut -d, -f-4,6,8- 
4个回答

148

您应该可以直接在现有的-f规范中继续序列。

如果要跳过5和7,请尝试:

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

如果您要跳过单个连续列,也可以这样写:

cut -d, -f-4,6,8-
为了保持运行,如果你想跳过5、7和11,你将使用:

要保持运作,如果您要跳过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”。


2
6-6 可能有效,但更常规的写法是 6 - Jonathan Leffler
@JonathanLeffler 是的,我知道 - 但我在示例中保留了 6-6,以展示使用更宽范围的列会是什么样子。例如,如果 OP 想要跳过 5 和 10,他需要 -f-4,6-9,11-。如果我将其折叠为 6,则可能(或可能不)可视化。但是,我编辑添加了一个连续列的示例 - 所以感谢您的提示 =] - newfurniturey

35

有时候,从哪些字段要排除的角度考虑问题更容易一些。

如果不被削减(不包含在输出中)的字段数量较少,则可以更轻松地使用--complement标志,例如包括所有1-20字段,但不包括第3、7和12个字段,可以这样操作:

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

与其说

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

12
你可以使用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的第二个数字,您可以指定要打印哪些列。

如果要打印的列是更加复杂的规范,则还可以使用“一行if语句”,例如

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]列表:值不能包括零 但如果我运行: echo 1,2,3,4,5,6,7,8,9,10 | cut -d,-f1,3,5,7,9 错误就消失了。 有人能解释一下吗?为什么使用seq会出现这个错误? - Bruce_Warrior
这个答案比本页面上的其他答案更加复杂且不够灵活。 - Chris Johnson

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]"'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接