我有一个包含多行数据的文件。有些行包含三列,但大多数只包含两列。所有行都是单标签分隔的。对于包含三列的那些,第三列通常是冗余的,包含与第二列相同的数据,因此我想将其删除。
我想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,我得到一些输出,但它只有少数几行,只有第一列。
有人能告诉我我应该做什么吗?
答案 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