免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求命令行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-29 11:17 |只看该作者 |倒序浏览
本帖最后由 章鱼的腿 于 2013-05-29 11:28 编辑

有两个文件,内容分别如下
  1. This is output:
  2. out1:
  3. Yes, this is out1.
  4. out2:
  5. Yes, this is out2.
  6. out3:
  7. Yes, this is out3.

  8. This is input:
  9. input1:
  10. yes, this is input1.
  11. input2:
  12. yes, this is input2.
  13. input3:
  14. yes, this is input3.
复制代码
  1. This is output:
  2. out1:
  3. Yes, this is out1.
  4. out3:
  5. Yes, this is out3.
  6. out2:
  7. Yes, this is out2.

  8. This is input:
  9. input2:
  10. yes, this is input2.
  11. input1:
  12. yes, this is input1.
  13. input3:
  14. yes, this is input3.
复制代码
这样的文件认为是一样的, 要求就是
1) 两个文件某些行必须一致 "This is output:" 和 "This is input:"
2) 两个为一组 顺序不能乱 比如
out1:
Yes, this is out1.
3) 各个组之间可以交叉顺序.
4) input的和output的组不能互换.

请教各位大侠请教一下,能否写出一个脚本,最少是一个命令行来判断这两个文件是否相等呢.

论坛徽章:
0
2 [报告]
发表于 2013-05-29 11:32 |只看该作者
本帖最后由 peawseshc 于 2013-05-29 11:32 编辑
  1. diff <(sort file1) <(sort file2)
复制代码
如果没有输出,说明两个文件内容一致。

论坛徽章:
0
3 [报告]
发表于 2013-05-29 13:21 |只看该作者
回复 2# peawseshc


    目测这个不行,因为要求是某些行一致的. 这个检测不出来.而且要分组的

论坛徽章:
0
4 [报告]
发表于 2013-05-30 16:27 |只看该作者
我实在写不出来,求教高手

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
5 [报告]
发表于 2013-05-30 17:58 |只看该作者
不是很清楚是不是达成楼主的想法,参考一下吧:
  1. awk 'head==0||(FNR==1){head=$0; next} /^$/{head=0; next} /:$/{sub_head=$0; next} FNR==NR{ar[head,sub_head]=$0; count1++} FNR!=NR{ar2[head,sub_head]=$0; count2++} END{same="same"; if(count1!=count2)same="different"; else {for(i in ar){if(ar[i]!=ar2[i]){same="different"; break;}}} print "Result: " same}' 1.txt 2.txt
复制代码

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
6 [报告]
发表于 2013-05-30 21:42 |只看该作者
本帖最后由 cao627 于 2013-05-30 21:44 编辑

@seesea2517
楼主说“input的和output的组不能互换”
意思好像是你代码中的某head在文件一和在文件二中的绝对位置相对位置,不能变。
如果是这个要求,你的代码就不能满足这个要求。
也不知道楼主是不是有这个要求
有这个要求的话也不知道到底是
要求绝对位置不变:即某head在两文件中的绝对行号一致 如headA在文件1中绝对行号为第6行,那么文件2中的headA的绝对行号也是第6行。
还是相对位置不变:即在两文件中任意两head的相对位置关系一致,如在文件1中headA在headB之前,那么在文件2中headA也在headB之前,但绝对行号可以不一致,即允许两文件空行数不一致。
@章鱼的腿

论坛徽章:
22
CU大牛徽章
日期:2013-09-18 15:22:06白羊座
日期:2014-04-14 22:56:32午马
日期:2014-05-16 17:18:08巳蛇
日期:2014-05-30 20:53:19寅虎
日期:2014-06-03 10:53:34未羊
日期:2014-08-12 22:15:31神斗士
日期:2015-11-20 17:26:2515-16赛季CBA联赛之浙江
日期:2016-03-15 18:27:4215-16赛季CBA联赛之同曦
日期:2016-03-22 09:21:0115-16赛季CBA联赛之北控
日期:2017-03-26 21:47:12技术图书徽章
日期:2014-04-03 16:47:26摩羯座
日期:2014-03-25 23:51:36
7 [报告]
发表于 2013-05-31 14:28 |只看该作者
这样的文件认为是一样的, 要求就是
1) 两个文件某些行必须一致 "This is output:" 和 "This is input:"
2) 两个为一组 顺序不能乱 比如
out1:
Yes, this is out1.
3) 各个组之间可以交叉顺序.
4) input的和output的组不能互换.

我想了一下,按照下面的想法来写应该是可以的:
1.首先判断两个文件的合法性:是否符合规则1、2和4。
第一行检查是判断/^this is output/和空行/^$/之间不能有/input*/;/^this is input$/和最后一行$之间不能有/out*/。
第二项检查是判断/^this is output/和空行/^$/之间的语句两行两行之间是否匹配,即/out[0-9]*/的下一行(N)是否为”/this is out[0-9]*/“,并且/out[0-9]*/与其下一行this is out[0-9]*中out[0-9]*是否相同。

2.排序
给合法文件排序,如果文件合法,且排序的结果是相同,则都会是正确。当然这里面什么的空格啊之类的就可考虑进入,不知道楼主有没有这个需求。

论坛徽章:
22
CU大牛徽章
日期:2013-09-18 15:22:06白羊座
日期:2014-04-14 22:56:32午马
日期:2014-05-16 17:18:08巳蛇
日期:2014-05-30 20:53:19寅虎
日期:2014-06-03 10:53:34未羊
日期:2014-08-12 22:15:31神斗士
日期:2015-11-20 17:26:2515-16赛季CBA联赛之浙江
日期:2016-03-15 18:27:4215-16赛季CBA联赛之同曦
日期:2016-03-22 09:21:0115-16赛季CBA联赛之北控
日期:2017-03-26 21:47:12技术图书徽章
日期:2014-04-03 16:47:26摩羯座
日期:2014-03-25 23:51:36
8 [报告]
发表于 2013-05-31 14:31 |只看该作者
对了,上面漏写了一些,第二项检查也是要包括/input/和$最后一行之间的语句,和out的地方是一样的工作。
我现在写一下出来看看。

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
9 [报告]
发表于 2013-05-31 17:22 |只看该作者
回复 6# cao627


    呵,楼主不见了,问题可能并不复杂,只是描述的复杂了,等楼主来了再问问清楚。

论坛徽章:
22
CU大牛徽章
日期:2013-09-18 15:22:06白羊座
日期:2014-04-14 22:56:32午马
日期:2014-05-16 17:18:08巳蛇
日期:2014-05-30 20:53:19寅虎
日期:2014-06-03 10:53:34未羊
日期:2014-08-12 22:15:31神斗士
日期:2015-11-20 17:26:2515-16赛季CBA联赛之浙江
日期:2016-03-15 18:27:4215-16赛季CBA联赛之同曦
日期:2016-03-22 09:21:0115-16赛季CBA联赛之北控
日期:2017-03-26 21:47:12技术图书徽章
日期:2014-04-03 16:47:26摩羯座
日期:2014-03-25 23:51:36
10 [报告]
发表于 2013-05-31 20:35 |只看该作者
本帖最后由 GB_juno 于 2013-05-31 20:37 编辑

写了个简单的实现,刚学不太久,请斧劈
这里面的与楼主不一样的是正确文本的“Yes|yes”都统一成了yes了。
  1. #!/bin/sh
  2. if [[ $# -ne 2 ]];
  3.         then echo "please input two file names!";
  4. fi

  5. flag=0;
  6. for i in $@;
  7.         do
  8.         check1=$(sed -n -e '/^This is output:$/,/^$/{/input/=;}' -e '/^This is input:$/,${/out/p;}' $i);
  9.         check2=$(sed -e "/^This/d;/^$/d" $i|sed -e '/^out[0-9][0-9]*/{N;/\nyes, this is out/d;}' -e'/^input[0-9][0-9]*/{N;/\nyes, this is input/d;}');
  10.         check3=$(sed -e "/^This/d;/^$/d" -e "s/\./:/g" $i|awk '/^(out|input)[0-9][0-9]*:$/{a=$1;next;}{if (a!=$4) print a"!="$4}');
  11.         if [[ -n $check1 ]]||[[ -n $check2 ]]||[[ -n $check3 ]];then
  12.                 echo "file $i is illegal";
  13.                 echo "---------------------";
  14.                 echo -e "check1\n$check1";
  15.                 echo -e "check2\n$check2";
  16.                 echo -e "check3\n$check3";
  17.                 echo "---------------------";
  18.                 echo;
  19.                 flag=1;
  20.         fi
  21. done;
  22. if [[ $flag -eq 0 ]];then
  23.         for i in $@;
  24.                 do
  25.                 sed -e "/^This/d;/^$/d" $i| sort > $i.tmp
  26.         done;
  27.         temp=$(diff $1.tmp $2.tmp)
  28.         if [[ -n $temp ]];then
  29.                 echo "$1 is different from $2";
  30.         else
  31.                 echo "$1 is the same as $2";
  32.         fi
  33.         rm -rf $1.tmp $2.tmp
  34. fi
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP