使用cut命令删除多个列

时间:2012-12-03 19:42:24

标签: bash cut

给定输入

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

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

cut -d, -f-4,6-

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

4 个答案:

答案 0 :(得分:79)

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

答案 1 :(得分:15)

有时,根据要排除的字段更容易思考。

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

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

而不是

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

答案 2 :(得分: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数,您可以指定要打印的列。

如果要打印的列的规格更复杂,您还可以使用“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的所有列 - 您可以简单地修改条件以创建更复杂的条件,以指定要打印列的天气。

答案 3 :(得分:0)

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