使用剪切命令删除多个列(Using cut command to remove multiple c

2019-06-21 11:58发布

给定输入

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

如果我希望削减列5我能做到

cut -d, -f-4,6-

如果我想要的削减多个不连续的列像5,7,等有没有一个班轮?

Answer 1:

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



Answer 2:

有时更容易想到其中的字段排除条款。

如果字段不被切断(不被保留在输出)的数量是小的,它可能是更容易使用的--complement标志,例如,以包括所有字段1-20除了不3,7,和12 - DO这个:

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

而不是

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


Answer 3:

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

这将打印所有奇数列

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



Answer 4:

同样可以用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]"'


文章来源: Using cut command to remove multiple columns
标签: bash cut