0

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

我想 awk 或 cut 是合适的,但我在如何测试三列的行上画了一个空白,所以我的脚本只能在这些行上工作。我知道 awk 是一种非常强大的语言,它具有逻辑和内置的东西,我只是不擅长它。

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

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

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

但是当我(使用文件)运行它时,什么也没有发生。如果我更改 NF-1 或 NF-2,我会得到一些输出,但它只有几行而且只有第一列。

谁能告诉我我应该做什么?

4

4 回答 4

3

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

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

它类似于 cut:

cut -f 1,2
于 2013-09-05T00:59:44.157 回答
1

The awk variable NF gives you the number for fields. So an expression like this should work for you.

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

Running it on an input file like so

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

gives me

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

a,b
x,y
u,v
l,m
于 2013-09-05T06:34:46.000 回答
0

这可能对您有用(GNU sed):

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

将文件限制为两列。

于 2013-09-05T06:28:37.370 回答
0
awk 'NF==3{print $1"\t"$2}NF==2{print}' your_file

下面测试:

> 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
于 2013-09-05T06:33:25.587 回答