80

给定输入

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

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

切-d,-f-4,6-

如果我想剪切多个不连续的列,如 5、7 等,是否有一个内衬?

4

4 回答 4

127

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

于 2012-12-03T19:49:30.950 回答
30

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

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

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

而不是

cut -d, -f-2,4-6,8-11,13-
于 2016-02-03T18:00:16.297 回答
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 的所有列 - 您可以简单地修改条件以创建更复杂的条件来指定应打印列的天气。

于 2012-12-03T19:53:14.607 回答
3

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]"'
于 2018-02-22T19:55:13.240 回答