给定输入
echo 1,2,3,4,5,6,7,8,9,...100
如果我希望削减列5我能做到
cut -d, -f-4,6-
如果我想要的削减多个不连续的列像5,7,等有没有一个班轮?
给定输入
echo 1,2,3,4,5,6,7,8,9,...100
如果我希望削减列5我能做到
cut -d, -f-4,6-
如果我想要的削减多个不连续的列像5,7,等有没有一个班轮?
您应该能够直接继续在现有的序列-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”。
有时更容易想到其中的字段排除条款。
如果字段不被切断(不被保留在输出)的数量是小的,它可能是更容易使用的--complement
标志,例如,以包括所有字段1-20除了不3,7,和12 - DO这个:
cut -d, --complement -f3,7,12 <inputfile
而不是
cut -d, -f-2,4-6,8-11,13-
您可以使用了序列削减所有奇数/偶数列:
这将打印所有奇数列
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]"'