如何剪切前n列和后n列?

时间:2011-02-10 12:08:26

标签: linux bash shell

如何从制表符分隔文件中删除第一个 n 和最后一个 n 列?

我试过这个来删除第一个 n 列。但我不知道将第一列和最后一列结合起来

cut -f 1-10 -d "<CTR>v <TAB>" filename

7 个答案:

答案 0 :(得分:94)

剪切可以在-f中使用多个范围:

最多4列和7点以后的列:

cut -f -4,7-

或对于字段1,2,5,6和从10开始:

cut -f 1,2,5,6,10-

答案 1 :(得分:1)

使用AWK切断第一个和最后一个字段:

awk '{$1 = ""; $NF = ""; print}' inputfile

不幸的是,这会留下字段分隔符,所以

aaa bbb ccc

变为

[space]bbb[space]

要使用kurumi的答案来做到这一点,这个答案不会留下额外的空间,而是以某种方式特定于您的要求:

awk '{delim = ""; for (i=2;i<=NF-1;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfile

这也解决了答案中的几个问题。

概括说明:

awk -v skipstart=1 -v skipend=1 '{delim = ""; for (i=skipstart+1;i<=NF-skipend;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfile

然后,您可以通过更改命令开头的变量赋值来更改要在开头或结尾跳过的字段数。

答案 2 :(得分:0)

您可以使用以下方式剪切,
-d:分隔符,-f表示字段
\ t用于制表符分隔的字段

cut -d$'\t' -f 1-3,7-

答案 3 :(得分:0)

问题的第一部分很简单。正如已经指出的,cut接受省略列范围的开始或结束索引,将其解释为“从开始到列 n (包括)”或“从列开始” > n (包括末尾),”:

$ printf 'this:is:a:test' | cut -d: -f-2
this:is
$ printf 'this:is:a:test' | cut -d: -f3-
a:test

它还支持 combining 范围。如果需要,例如7列中的前3列和后2列:

$ printf 'foo:bar:baz:qux:quz:quux:quuz' | cut -d: -f-3,6-
foo:bar:baz:quux:quuz

但是,问题的第二部分可能会有些棘手,具体取决于您期望的输入类型。如果用“最后 n 列”的意思是“最后 n 列(不管它们在整个行中的索引如何)”(即因为您不一定知道多少列您将要提前找到),那么遗憾的是,单独使用cut是不可能完成的。为了有效地使用cut提取每行中的“最后 n 列”,必须预先知道每行中列的总数 ,每行所包含的列数必须一致。

如果您不知道每行中可能存在多少个“列”(例如,因为您使用的是严格非表格形式的输入),那么您将不得不使用一些例如awk。例如,使用awk从输入的每一行中提取最后2个“列”(awk称为 fields ,每行的数量可以变化):

$ printf '/a\n/a/b\n/a/b/c\n/a/b/c/d\n' | awk -F/ '{print $(NF-1) FS $(NF)}'
/a
a/b
b/c
c/d

答案 4 :(得分:-1)

你可以使用awk,例如,切掉第1列,第2列和最后3列

awk '{for(i=3;i<=NF-3;i++} print $i}' file

如果你有一个编程语言,如Ruby(1.9 +)

$ ruby -F"\t" -ane 'print $F[2..-3].join("\t")' file

答案 5 :(得分:-1)

尝试以下方法:

echo a#b#c | awk -F"#" '{$1 = ""; $NF = ""; print}' OFS=""

答案 6 :(得分:-1)

使用

cut -b COLUMN_N_BEGINS-COLUMN_N_UNTIL INPUT.TXT > OUTPUT.TXT

-f在文本文件中有“标签”的情况下不起作用。