免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5545 | 回复: 15

[文本处理] 删除文本中某一列---太折腾人了 [复制链接]

论坛徽章:
3
亥猪
日期:2013-08-28 12:50:23白羊座
日期:2013-11-25 12:55:50酉鸡
日期:2014-02-12 10:46:13
发表于 2013-12-23 16:22 |显示全部楼层
文本文件a.dat:
insert into t values(1,'abc',78,'greger2343','grtg');
insert into t values(2,'dgre',44,'jty','grtg');
insert into t values(3,'grhg',65,'66k','ghre');
insert into t values(4,'muy',68,'yj','g5');
insert into t values(5,'54yn',98,'67','54h');
.......
表件中放的是表T的所有记录,是SQL的格式存放的。表T有5个属性,N条记录。即,文本中“(” 与 “)”之间以“,”隔开的有5个域,文件中共N行数据。
要求删除第M列。
例:
如果M为5,删除后的结果应该为:
insert into t values(1,'abc',78,'greger2343');
insert into t values(2,'dgre',44,'jty');
insert into t values(3,'grhg',65,'66k');
insert into t values(4,'muy',68,'yj');
insert into t values(5,'54yn',98,'67');
如果M为3,删除后的结果应该为:
insert into t values(1,'abc',greger2343','grtg');
insert into t values(2,'dgre','jty','grtg');
insert into t values(3,'grhg','66k','ghre');
insert into t values(4,'muy','yj','g5');
insert into t values(5,'54yn','67','54h');
大虾们帮忙看看,有没有什么好的方案?

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
发表于 2013-12-23 16:53 |显示全部楼层
本帖最后由 yestreenstars 于 2013-12-23 16:54 编辑
  1. [root@localhost ~]# awk -vM=3 'BEGIN{FS=",";RS="[()]"}NF==5{for(i=0;i++<NF;)if(i!=M)s=s?s","$i:$i;$0=s;s=""}{printf $0 RT}' i
  2. insert into t values(1,'abc','greger2343','grtg');
  3. insert into t values(2,'dgre','jty','grtg');
  4. insert into t values(3,'grhg','66k','ghre');
  5. insert into t values(4,'muy','yj','g5');
  6. insert into t values(5,'54yn','67','54h');
  7. [root@localhost ~]# awk -vM=5 'BEGIN{FS=",";RS="[()]"}NF==5{for(i=0;i++<NF;)if(i!=M)s=s?s","$i:$i;$0=s;s=""}{printf $0 RT}' i
  8. insert into t values(1,'abc',78,'greger2343');
  9. insert into t values(2,'dgre',44,'jty');
  10. insert into t values(3,'grhg',65,'66k');
  11. insert into t values(4,'muy',68,'yj');
  12. insert into t values(5,'54yn',98,'67');
  13. [root@localhost ~]#
复制代码

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2013-12-23 16:53 |显示全部楼层
  1. [root@everIover ~]# cat ii
  2. insert into t values(1,'abc',78,'greger2343','grtg');
  3. insert into t values(2,'dgre',44,'jty','grtg');
  4. insert into t values(3,'grhg',65,'66k','ghre');
  5. insert into t values(4,'muy',68,'yj','g5');
  6. insert into t values(5,'54yn',98,'67','54h');
  7. [root@everIover ~]# awk -vFS="[(),]" '{printf("%s(%s,%s,%s,%s",$1,$2,$3,$5,$6) ;print ")"}' ii
  8. insert into t values(1,'abc','greger2343','grtg')
  9. insert into t values(2,'dgre','jty','grtg')
  10. insert into t values(3,'grhg','66k','ghre')
  11. insert into t values(4,'muy','yj','g5')
  12. insert into t values(5,'54yn','67','54h')
  13. [root@everIover ~]#
复制代码

论坛徽章:
3
亥猪
日期:2013-08-28 12:50:23白羊座
日期:2013-11-25 12:55:50酉鸡
日期:2014-02-12 10:46:13
发表于 2013-12-23 17:08 |显示全部楼层
回复 3# 这个冬天不冷

TKS!
需要删除的第M列是一个入参。大虾好像把它给写死了,而且最后的;给弄没了

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2013-12-23 17:11 |显示全部楼层
回复 1# joepayne

$ awk -F'[(,)]' -vM=5 '{s="";printf $1"(";for(n=2;n<NF;n++){if(n!=M+1){printf s$n;s=","}}print ");"}' a.dat
insert into t values(1,'abc',78,'greger2343');
insert into t values(2,'dgre',44,'jty');
insert into t values(3,'grhg',65,'66k');
insert into t values(4,'muy',68,'yj');
insert into t values(5,'54yn',98,'67');
jason@jason-VirtualBox:~/tmp
$ awk -F'[(,)]' -vM=3 '{s="";printf $1"(";for(n=2;n<NF;n++){if(n!=M+1){printf s$n;s=","}}print ");"}' a.dat
insert into t values(1,'abc','greger2343','grtg');
insert into t values(2,'dgre','jty','grtg');
insert into t values(3,'grhg','66k','ghre');
insert into t values(4,'muy','yj','g5');
insert into t values(5,'54yn','67','54h');
   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2013-12-23 17:18 |显示全部楼层
本帖最后由 这个冬天不冷 于 2013-12-23 17:26 编辑

回复 4# joepayne

确实写死了。最后一个;直接在awk -vFS="[(),]" '{printf("%s(%s,%s,%s,%s",$1,$2,$3,$5,$6) ;print ");"}' 最后加一个;就ok了
[root@everIover ~]# awk -vFS="[(),]" -vM=3 '{printf("%s(",$1);for(i=2;i<=6;i++){if(i==M)continue;printf("%s%s",f,$i);f=","}print ");";f=""}' ii
  1. [root@everIover ~]# awk -vFS="[(),]" -vM=3 '{printf("%s(",$1);for(i=2;i<=6;i++){if(i==M)continue;printf("%s%s",f,$i);f=","}print ");";f=""}' ii
  2. insert into t values(1,78,'greger2343','grtg');
  3. insert into t values(2,44,'jty','grtg');
  4. insert into t values(3,65,'66k','ghre');
  5. insert into t values(4,68,'yj','g5');
  6. insert into t values(5,98,'67','54h');
  7. [root@everIover ~]# cat ii
  8. insert into t values(1,'abc',78,'greger2343','grtg');
  9. insert into t values(2,'dgre',44,'jty','grtg');
  10. insert into t values(3,'grhg',65,'66k','ghre');
  11. insert into t values(4,'muy',68,'yj','g5');
  12. insert into t values(5,'54yn',98,'67','54h');
  13. [root@everIover ~]#
复制代码

论坛徽章:
4
金牛座
日期:2013-12-12 16:11:30巨蟹座
日期:2013-12-13 10:20:3615-16赛季CBA联赛之佛山
日期:2016-11-15 13:45:3515-16赛季CBA联赛之广夏
日期:2016-11-23 19:54:58
发表于 2013-12-23 17:18 |显示全部楼层
  1. bogon:~>cat sss.sh
  2. #!/bin/bash

  3. if [ $1 -le 5 ] && [ $1 -ge 1 ];then
  4.     awk -vM=$1 '{split($0,a,"[(,)]");printf a[1]"(";for(i=2;i<=6;i++){if(i!=M+1)printf a[i];if(i > 2&& i<6 && i!=M) printf ",";}printf ");\n"}' tmp
  5. else
  6.     echo "error! use arg[1-5]"
  7. fi
  8. exit 0
复制代码
QQ截图20131223171722.jpg

论坛徽章:
3
亥猪
日期:2013-08-28 12:50:23白羊座
日期:2013-11-25 12:55:50酉鸡
日期:2014-02-12 10:46:13
发表于 2013-12-23 17:26 |显示全部楼层
yestreenstars

jason680


两位兄台的大体思路都是一样的,利用 -V  接受外部参数(小弟第一次见有这用法),AWK中的多分隔符,然后在ACTION中加以判断处理。
感谢两位!小弟受教了。     {:3_189:}

论坛徽章:
3
亥猪
日期:2013-08-28 12:50:23白羊座
日期:2013-11-25 12:55:50酉鸡
日期:2014-02-12 10:46:13
发表于 2013-12-23 17:27 |显示全部楼层
效率也忒高了    哈哈

论坛徽章:
3
亥猪
日期:2013-08-28 12:50:23白羊座
日期:2013-11-25 12:55:50酉鸡
日期:2014-02-12 10:46:13
发表于 2013-12-23 17:34 |显示全部楼层
回复 7# 0x1024


多谢兄台!


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP