使用cut命令删除多个列

给定input

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

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

切-d,-f-4,6-

如果我想削减多个不连续的列,如5,7等,是否有一个class轮?

您应该能够直接在现有的-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- 

从更清晰的angular度来看,分别使用序列列表的开始/结束处的开始/结束列时,可以更容易地看到它们。 例如,以下内容将打印2到20列,跳过5和7:

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

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

您可以通过使用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的所有列 – 您可以简单地修改条件以创build更复杂的条件来指定天气列将被打印。

有时从哪个字段排除来考虑更容易。

如果没有被剪切的字段数量(不被保留在输出中)很小,使用--complement标志可能会更容易,例如包含所有的字段1-20,除了不是--complement和12,这个:

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

而不是

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