给定输入
回声1,2,3,4,5,6,7,8,9,... 100
如果我想减少第5列,我可以做
切-d,-f-4,6-
如果我想切割多个不连续的列(如5、7等)怎么办?
Answers:
您应该能够直接在现有-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”。
6-6
在示例中保留了使用更大范围的列的外观。例如,如果OP希望跳过5和10,则需要-f-4,6-9,11-
。如果我将其折叠为just,则可能会(也可能不会)看到6
。但是,我也编辑添加了一个带有连续列的示例-因此,谢谢您的提示=]
您可以使用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的所有列-您可以简单地修改条件以创建更复杂的条件以指定要打印列的天气。
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
。