如何减少前n列和后n列?


72

我怎样才能切断第一ñ最后ñ从制表符分隔文件列?

我试图这样做,以减少前n列。但我不知道将第一列和最后一列合并

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

Answers:


114

切割的范围可以包括-f

从4到7的列:

cut -f -4,7-

或对于字段1,2,5,6以及从10开始的字段:

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

等等


11
它使用定界符效果更好。......cut -d''-f -2 <<<'这是一个测试'
Yogamurthy 2015年

1
默认的分隔符是tab,所以@Yogamurthy的注释是解决方法。
Noumenon

2
这不能回答问题的“最后n列”部分。
LoMaPh

3

您可以使用以下
-D分隔符:-,分隔符-f用于字段
\ t,用于制表符分隔的字段

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

2

您问题的第一部分很容易。如前所述,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

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

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


我正在尝试从git branch-v削减输出,某些行有一个额外的*,所以我需要削减像OP询问的列,而不是字段,awk仅在您想削减字段的情况下才起作用,不同的问题……
Cobusve

0

您可以为此使用Bash:

while read -a cols; do echo ${cols[@]:0:1} ${cols[@]:1,-1}; done < file.txt

-1

您可以使用awk,例如,切断第一,第二和最后三列

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

您的awk语法似乎已
停用

-1

请尝试以下操作:

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

-1

采用

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

-f 如果文本文件中有“标签”,则无法使用。


这不能回答问题。How can I cut off the first n and the last n columns from a **tab** delimited file?问题是关于TAB列,范围从头到尾。您的答案是关于一个连续的字节范围
jeb

不幸的是,我只看到标题而不是内容,有人知道如何删除答案吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.