我怎样才能切断第一ñ最后ñ从制表符分隔文件列?
我试图这样做,以减少前n列。但我不知道将第一列和最后一列合并
cut -f 1-10 -d "<CTR>v <TAB>" filename
Answers:
您问题的第一部分很容易。如前所述,cut接受省略列范围的开始索引或结束索引,将其解释为“从开始到第n列(包括)”或“从第n列(包括)到结尾”。分别:
$ printf 'this:is:a:test' | cut -d: -f-2
this:is
$ printf 'this:is:a:test' | cut -d: -f3-
a:test
它还支持组合范围。如果需要,例如,每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称为字段,其数量可能随行而变化):
$ 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
要使用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
然后,您可以通过更改命令开头的变量分配来更改要在开头或结尾处跳过的字段数。