分页: 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}'
很显然不妥,你把结果拿到文本编辑器里看看?看不清楚就用十六进制编辑器。

老老实实正则或是循环吧...如果赋值开销不太大...
代码: 全选
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
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程序输出当前行
哦,原来这样。谢谢了