免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1827 | 回复: 8
打印 上一主题 下一主题

[文本处理] 请问如何将特定符号内的内容当做一个变量再逐行比较 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-09 15:36 |只看该作者 |倒序浏览
请问如何将特定符号内的内容当做一个变量再逐行比较

例如
有两个文件,内容格式都如下:

select sqlsql(
fad
fasdfasdf
afasdf
adfad
fasdf
);

select sqlsql(
fasd
fasdfasdf
addfassdfa
fadfasd
fasdfasd
fadfa
fad
);

他们都有相同的头select sqlsql(
和相同尾);
但中间行数不定

请问怎么才能把这样的一小段一小段当做一个整体,然后根据文件1中的一个这个东西到文件2中查找并逐行比较?

万分感谢!





论坛徽章:
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
2 [报告]
发表于 2012-11-09 15:43 |只看该作者
逐行比较,然后呢?想要的结果是什么?

论坛徽章:
0
3 [报告]
发表于 2012-11-09 15:48 |只看该作者
希望知道哪儿不一样,最好能把不同的行号也给显示出来

论坛徽章:
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
4 [报告]
发表于 2012-11-09 15:50 |只看该作者
还是没有描述清楚,把你想要的结果写出来吧。

论坛徽章:
0
5 [报告]
发表于 2012-11-09 16:20 |只看该作者
比如文件1中的有一组内容是这样的:
select sqlsql(
111
222
333
4444
555
);
比如文件2中的有一组内容是这样的:
select sqlsql(
111
222
333
444
555
666
);

他们的不同是在:
444
和文件2的666,对吧
我希望能告诉我:
如:
文件1     文件2
line5 444    4444
line7            666

论坛徽章:
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
6 [报告]
发表于 2012-11-09 17:28 |只看该作者
本帖最后由 yestreenstars 于 2012-11-09 17:52 编辑

你给的结果反了,应该是这样:
文件1     文件2
line5 4444    444
line7            666

我写了一个shell,不过有局限性,必须把总行数较多的文件的文件名赋值给$y才有效。
  1. #!/bin/bash
  2. i=1
  3. j=1
  4. x="1.txt"
  5. y="2.txt"
  6. while read line
  7. do
  8.         if [[ !("$line" =~ "(") && !("$line" =~ ")") ]]; then
  9.                 a[$i]=$line
  10.         fi
  11.         let i++
  12. done < $x
  13. while read line
  14. do
  15.         if [[ !("$line" =~ "(") && !("$line" =~ ")") ]]; then
  16.                 b[$j]=$line
  17.         fi
  18.         let j++
  19. done < $y
  20. echo -e "\t$x\t$y"
  21. for((i=2;i<=$(sed -n '$=' $y)-1;i++))
  22. do
  23.         if [[ "${a[$i]}" != "${b[$i]}" ]]; then
  24.                 echo -e "line$i\t${a[$i]}\t${b[$i]}"
  25.         fi
  26. done
复制代码

论坛徽章:
0
7 [报告]
发表于 2012-11-09 17:43 |只看该作者
这个。。。看不懂
关键是我这大文件执行了之后,好久还没有出结果呢

论坛徽章:
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
8 [报告]
发表于 2012-11-09 18:02 |只看该作者
本帖最后由 yestreenstars 于 2012-11-09 18:05 编辑

那试一下这个吧,道理是一样的:
  1. awk 'NR==1{f=FILENAME}NR==FNR{if($0!~/\(/&&$0!~/\)/)a[NR]=$0;if($0~/\)/)n=NR;next}{if($0!~/\(/&&$0!~/\)/)b[NR-n]=$0}END{printf "\t%s\t%s\n",FILENAME,f;for(i=2;i<=n-1;i++)if(a[i]!=b[i])printf "%s\t%s\t%s\n","line"i,b[i],a[i]}' 2.txt 1.txt
复制代码
注意:行数多的文件要写在前面,这里的2.txt的行数比1.txt的多,所以写在前面。

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
9 [报告]
发表于 2012-11-09 20:18 |只看该作者
try
    "diff -y file1 file2"
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP