2012-12-03 29 views

回答

58

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

+0

'6-6'可能有效,但更多的传统写作'6'。 –

+0

@JonathanLeffler是的,我知道 - 但我在示例中保留了'6-6',表示使用更宽范围的列的样子。例如,如果OP想跳过5和10,他需要'-f-4,6-9,11-'。如果我将它折叠为“6”,这可能(或可能不会)可视化。但是,我编辑添加了一个连续列的例子 - 所以谢谢你的提示=] – newfurniturey

11

您可以使用了序列削减所有奇数/偶数列:

这将打印的所有奇数列

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

如果要打印的列规格是比较复杂的,你也可以使用“一衬,如果从句”像

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的所有列 - 你可以简单地修改应创建条件以创建更复杂的条件来指定天气栏。

+0

在Mac Os(达尔文)中使用: echo 1,2,3,4,5,6,7,8,9, 10 | cut -d,-f $(seq -s,1 2 10) 我得到这个错误 cut:[-cf] list:值可能不包括零 但是如果我运行: echo 1,2,3,4 ,5,6,7,8,9,10 |切-d,-f1,3,5,7,9, 错误消失。 有人可以试图解释这个吗?为什么如果使用seq给出这个错误? –

9

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

如果未被剪切的字段的数量(未保留在输出中)很小,则使用--complement标记可能更容易,例如,包括所有领域1-20除了没有3,7,和12 - 做到这一点:

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

不是

cut -d, -f-2,4-6,8-11,13- 
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]"'