分页: 1 / 1

删除列

发表于 : 2011-10-26 9:58
mad_frog
求方法实现删除列操作
1 2 3 5 1
2 0 a 3 4 5
1 0 2 3 a 4
1 2 4 5 4
1 3 2 a 4
如果第二列出现了“0”,则删除该列,效果如下:
1 2 3 5 1
2 a 3 4 5
1 2 3 a 4
1 2 4 5 4
1 3 2 a 4

Re: 删除列

发表于 : 2011-10-27 15:34
Methuselar
我有个很脏的做法不知道是否不妥...

代码: 全选

awk '$2 == "0" {$2="\b"} {print}'

Re: 删除列

发表于 : 2011-10-27 16:35
lilydjwg
Methuselar 写了:我有个很脏的做法不知道是否不妥...

代码: 全选

awk '$2 == "0" {$2="\b"} {print}'
很显然不妥,你把结果拿到文本编辑器里看看?看不清楚就用十六进制编辑器。

Re: 删除列

发表于 : 2011-10-27 16:39
eexpress
● cat t |sed '/.*\ 0\>/d'
# ● 2011-10-27_16:43:40
1 2 3 5 1
1 2 4 5 4
1 3 2 a 4

Re: 删除列

发表于 : 2011-10-27 16:41
Methuselar
lilydjwg 写了:
Methuselar 写了:我有个很脏的做法不知道是否不妥...

代码: 全选

awk '$2 == "0" {$2="\b"} {print}'
很显然不妥,你把结果拿到文本编辑器里看看?看不清楚就用十六进制编辑器。
:P 老老实实正则或是循环吧...如果赋值开销不太大...

代码: 全选

awk '$2 == "0" {for(i=2; i<=NF; i++){ $i=$((i+1))};NF=NF-1 } {print}'
PS: EE 你把人家一行都删了....

Re: 删除列

发表于 : 2011-10-27 21:05
fnan
kose3@kose3-laptop:~$ cat 1.t
1 2 3 5 1
2 0 a 3 4 5
1 0 2 3 a 4
1 2 4 5 4
1 3 2 a 4
1 2 0 30 5
1 10 30 5
kose3@kose3-laptop:~$ sed -r 's/^(\S+)\s\S*0\S*/\1/' 1.t
1 2 3 5 1
2 a 3 4 5
1 2 3 a 4
1 2 4 5 4
1 3 2 a 4
1 2 0 30 5
1 30 5

Re: 删除列

发表于 : 2011-10-28 0:32
Methuselar
这样老老实实的C写法可能性能会高点...

代码: 全选

awk '$2 == "0" {printf $1; for (i=3; i<=NF; i++) {printf(" %s", $i)}; print "";next}1'
突然想起来awk的sub...针对第2列的话语句会很短

代码: 全选

awk '$2 == "0" {sub($1" 0", $1, $0)}1'
都是hardcode...要是awk有cut -f3-这样好用的操作符就好了...

代码: 全选

awk '$2 == "0" {printf("%s%s", $1,FS); system("echo "$0" | cut -d\""FS"\"  -f3-"); next;}1'

Re: 删除列

发表于 : 2011-10-28 5:49
fnan
awk '$2~/0/ {sub(" "$2,"")}1'

Re: 删除列

发表于 : 2011-11-06 17:01
MaskRay

代码: 全选

colrm 2 3

Re: 删除列

发表于 : 2011-11-21 11:01
bellszhu
Methuselar 写了:这样老老实实的C写法可能性能会高点...

代码: 全选

awk '$2 == "0" {printf $1; for (i=3; i<=NF; i++) {printf(" %s", $i)}; print "";next}1'
突然想起来awk的sub...针对第2列的话语句会很短

代码: 全选

awk '$2 == "0" {sub($1" 0", $1, $0)}1'
都是hardcode...要是awk有cut -f3-这样好用的操作符就好了...

代码: 全选

awk '$2 == "0" {printf("%s%s", $1,FS); system("echo "$0" | cut -d\""FS"\"  -f3-"); next;}1'
awk '$2 == "0" {printf $1; for (i=3; i<=NF; i++) {printf(" %s", $i)}; print "";next}1'
中的,最后面的1 表示什么意思??

Re: 删除列

发表于 : 2011-11-21 13:40
Ubuntu与Linux
这不是删除列吧,是删除那个位置的‘0’?

Re: 删除列

发表于 : 2011-11-21 14:51
Methuselar
大括号以外的awk表达式,awk检查其是否为数字0, 大于0时awk输出,0时或非数字不输出. 基本就是如此, 所以“1”用来简洁的让awk程序输出当前行

Re: 删除列

发表于 : 2011-11-21 16:05
bellszhu
Methuselar 写了:大括号以外的awk表达式,awk检查其是否为数字0, 大于0时awk输出,0时或非数字不输出. 基本就是如此, 所以“1”用来简洁的让awk程序输出当前行
哦,原来这样。谢谢了