给定输入
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-
您应该可以直接在现有的-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”。
有时候,从哪些字段要排除的角度考虑问题更容易一些。
如果不被削减(不包含在输出中)的字段数量较少,则可以更轻松地使用--complement
标志,例如包括所有1-20字段,但不包括第3、7和12个字段,可以这样操作:
cut -d, --complement -f3,7,12 <inputfile
与其说
cut -d, -f-2,4-6,8-11,13-
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的所有列 - 您可以简单地修改条件以创建更复杂的条件来指定是否应打印一列。
同样的方法也适用于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]"'
6-6
可能有效,但更常规的写法是6
。 - Jonathan Leffler6-6
,以展示使用更宽范围的列会是什么样子。例如,如果 OP 想要跳过 5 和 10,他需要-f-4,6-9,11-
。如果我将其折叠为6
,则可能(或可能不)可视化。但是,我编辑添加了一个连续列的示例 - 所以感谢您的提示 =] - newfurniturey