使用cut命令删除多列


69

给定输入

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

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

切-d,-f-4,6-

如果我想切割多个不连续的列(如5、7等)怎么办?

Answers:


106

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


2
6-6可能有效,但通常写成6
乔纳森·莱夫勒

@JonathanLeffler是的,我知道-但我6-6在示例中保留了使用更大范围的列的外观。例如,如果OP希望跳过5和10,则需要-f-4,6-9,11-。如果我将其折叠为just,则可能会(也可能不会)看到6。但是,我也编辑添加了一个带有连续列的示例-因此,谢谢您的提示=]
newfurniturey 2012年

24

有时,更容易考虑要排除的字段。

如果未剪切的字段数很少(未保留在输出中),则使用该--complement标志可能会更容易,例如,包括除3、7和12以外的所有字段1-20,请执行以下操作:

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)

通过更改第二个序列号,您可以指定要打印的列。

如果要打印的列的说明比较复杂,您也可以使用“单线如果条款”

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] list:值可能不包括零,但是如果我运行:echo 1,2,3,4,5,6 ,7,8,9,10 | 剪切-d,-f1,3,5,7,9错误消失。有人可以解释一下吗?为什么使用seq会出现此错误?
Bruce_Warrior 2015年

1

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]"'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.