使用bash从包含三列的行中删除最后一列

时间:2013-09-05 00:56:18

标签: linux bash awk

我有一个包含多行数据的文件。有些行包含三列,但大多数只包含两列。所有行都是单标签分隔的。对于包含三列的那些,第三列通常是冗余的,包含与第二列相同的数据,因此我想将其删除。

我想awk或cut是合适的,但是我在如何测试三列的行上留下了空白,所以我的脚本只适用于那些行。我知道awk是一种非常强大的语言,有逻辑和内置于其中的东西,我只是不那么强大。

我看了similar question,但我不确定awk的答案是怎么回事。 -4应该是-1,因为我只想删除一列?如果行有两列呢?即使我不想做任何事情,它会删除第二个吗?

我将其修改为我认为的内容:

awk -F"\t" -v OFS="\t" '{ for (i=1;i<=NF-4;i++){ print $i }}' 

但是当我运行它(带文件)时没有任何反应。如果我改变NF-1或NF-2,我得到一些输出,但它只有少数几行,只有第一列。

有人能告诉我我应该做什么吗?

4 个答案:

答案 0 :(得分:3)

如果您只想删除第三列,则只需打印第一列和第二列:

awk -F '\t' '{print $1 "\t" $2}'

它与cut类似:

cut -f 1,2

答案 1 :(得分:1)

awk变量NF为您提供字段编号。所以这样的表达式对你有用。

awk -F, 'NF == 3 {print $1 "," $2} NF != 3 {print $0}'

在输入文件上运行

a,b,c
x,y
u,v,w
l,m

给了我

$ cat test | awk -F, 'NF == 3 {print $1 "," $2} NF != 3 {print $0}'

a,b
x,y
u,v
l,m

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed 's/\t[^\t]*//2g' file

将文件限制为两列。

答案 3 :(得分:0)

awk 'NF==3{print $1"\t"$2}NF==2{print}' your_file

下面的Testde:

> cat temp
1       2
3       4       5
6       7
8       9       10
>
> awk 'NF==3{print $1"\t"$2}NF==2{print}' temp
1       2
3       4
6       7
8       9
>

或以更简单的方式使用awk:

awk 'NF==3{print $1"\t"$2}NF==2' your_file

或者你也可以使用perl:

perl -lane 'print "$F[0]\t$F[1]"' your_file