Chinaunix

标题: 各位国庆节快乐,麻烦各位看下我这两个文件对比的的写法能否简化下 [打印本页]

作者: djzhangxing    时间: 2014-10-02 17:56
标题: 各位国庆节快乐,麻烦各位看下我这两个文件对比的的写法能否简化下
本帖最后由 djzhangxing 于 2014-10-02 17:56 编辑

我想判断file1的第一列和file2中的第一列和file1的中最后一列和file2的最后一列是否相同,不同则打印。

  1. 我最初的想法是想把file1、file2把$1和$NF重新导出2个新文件,然后通过数组,将两个文件 IP相同的合并成为一个,现在文件就是4列了,然后在$1和$3、$2和$4判断是否相同,这样一个好麻烦,最终的判断还没写完哈~~还能简单的写法吗?数组用的不太熟,不知道这样能不能行!生成两个文件的时候能否不产生,直接调用呢~!~国庆快乐哈
  2. awk 'NR==FNR{a[$1]=$0;next}{print a[$1]"|"$0}' file_new1 file_new2
复制代码

  1. 源文件
  2. cat file1
  3. 10.0.0.10 255.255.0.0  10.0.0.1
  4. 10.0.0.11 255.255.0.0  10.0.0.1
  5. 10.0.0.12 255.255.0.0  10.0.0.254

  6. cat file2
  7. 10.0.0.10 10.0.0.1
  8. 10.0.0.12 10.0.0.1
复制代码

作者: 李满满    时间: 2014-10-02 19:01
学生党:飘过~不知道楼主是不是这个意思?
Administrator@白头发 ~
$ awk 'NR==FNR{a[$1]=$NF;next}a[$1]!=$NF{print $1,a[$1],$2}' yhsafe1.txt yhsafe2.txt
10.0.0.12 10.0.0.254 10.0.0.1

作者: yestreenstars    时间: 2014-10-02 19:28
楼主的语文是数学老师教得吧~{:3_185:}
作者: djzhangxing    时间: 2014-10-02 22:05
哈哈~是体育老师!不好意思哈~~写了自己没读,我梳理下了烦请各位在查看哈~~~~!
我想判断file1的第一列和file2中的第一列,file1的中最后一列和file2的最后一列是否相同,不同则打印。
其实我就是要判断下10.0.0.10在(file1中的第二列是否与file2的第二列相同)和(file1中的第三列是否与file2的第三列相同),不同和不存在则打印!

  1. 源文件
  2. cat file1
  3. 10.0.0.10 255.255.0.0  10.0.0.1
  4. 10.0.0.11 255.255.0.0  10.0.0.1
  5. 10.0.0.12 255.255.0.0  10.0.0.254

  6. cat file2
  7. 10.0.0.10 255.255.0.0 10.0.0.1
  8. 10.0.0.12 10.0.0.1
复制代码
回复 3# yestreenstars


   
作者: wiliiwin    时间: 2014-10-02 22:07
不知道楼主是什么意思  我的理解是不打印  第一个文件的第一列和最后一列分别相等于第二文件的第一列和最后一列?

要是这样的话 那就什么都不打印的吧
作者: djzhangxing    时间: 2014-10-04 23:09
喔~可能我没把表达清楚。这样吧

  1. caf 1.txt
  2. 10.0.0.10 10.0.0.1        10.0.0.10 10.0.0.1
  3. 10.0.0.12 10.0.0.254        10.0.0.12 10.0.0.1
  4. 这个文件四列,我想判断$1==$3且$2==$4,不匹配则打印
复制代码


回复 5# wiliiwin


   
作者: wiliiwin    时间: 2014-10-05 11:10
djzhangxing 发表于 2014-10-04 23:09
喔~可能我没把表达清楚。这样吧

回复 5# wiliiwin

完全无法理解了,这样看成了一个文件了,不是两个文件的事情了,还是表达的不够清晰哦
作者: djzhangxing    时间: 2014-10-06 22:12
本帖最后由 djzhangxing 于 2014-10-06 22:15 编辑

,我之前那个条件太乱了,所以我把它变成一个文件了,这样更能让你们读懂,就是一个文件! 这样话也能达到我的需要的结果~~ 回复 7# wiliiwin


   
作者: wiliiwin    时间: 2014-10-06 23:26
本帖最后由 wiliiwin 于 2014-10-06 23:27 编辑

回复 8# djzhangxing
  1. # awk  '{if(!($1==$3 && $2==$4)){print $0}}'  11.txt
  2. 10.0.0.12 10.0.0.254        10.0.0.12 10.0.0.1
复制代码
难道是这样。。。。。。。。
作者: 李满满    时间: 2014-10-07 00:50
本帖最后由 李满满 于 2014-10-07 00:52 编辑

学生党:飘过~闲来无事用python写一下~

  1. $ cat yhsafe.py
  2. #!/usr/bin/env python
  3. # -*- coding: gbk -*-

  4. from sys import argv
  5. import fileinput as fi
  6. list=[]
  7. def pd_args(args):
  8.         if len(args[1:])!=2:
  9.                 return False
  10.         else:
  11.                 return True

  12. def pd_gets(args):
  13.         for line in fi.input(args[1:]):
  14.                 if fi.filename()=='file1.txt':
  15.                         list.append(line.strip().split())
  16.                 elif fi.filename()=='file2.txt':
  17.                         diff_f=line.strip().split()
  18.                         for x in list:
  19.                                 if diff_f[0]==x[0] and diff_f[1]!=x[2]:
  20.                                         print "{} {}".format(' '.join(x),line),
  21.                                         break
  22.                                 else:
  23.                                         pass

  24. if __name__=="__main__":
  25.         if pd_args(argv):
  26.                 pd_gets(argv)

复制代码

作者: djzhangxing    时间: 2014-10-07 18:03
本帖最后由 djzhangxing 于 2014-10-07 18:05 编辑

对对~~(另外也感谢10楼哈),这个是不是应该用“或”呢?只要是2个条件有一个不满足就打印。但是我自己这么写的"或"为什么有一个有问题,还有点小疑惑哈~~~。

  1. [root@12 zx]# cat file3.txt
  2. 10.0.0.10 10.0.0.1 10.0.0.10 10.0.0.1
  3. 10.0.0.12 10.0.0.254 10.0.0.12 10.0.0.1
  4. [root@12 zx]# awk '{if(($1!=$3 || $2!=$4)){print $0}}' file3.txt                 #(这是我想要的结果,结果也对)
  5. 10.0.0.12 10.0.0.254 10.0.0.12 10.0.0.1
  6. [root@12 zx]# awk '{if(!($1==$3 || $2==$4)){print $0}}' file3.txt              #(我想和做的一样,把"!"提出来,为什么打印是空,里面是满足"或"关系呀??)
  7. [root@12 zx]#
  8. [root@12 zx]#                                                                                          #########下面是"与"#############
  9. [root@12 zx]# awk '{if(($1!=$3 && $2!=$4)){print $0}}' file3.txt                #(而这里呢,是"与",我觉得打印空是对的,这个先过)
  10. [root@12 zx]# awk '{if(!($1==$3 && $2==$4)){print $0}}' file3.txt             #(然而这里呢,又打印出来了,这个$1==$3的,为什么打印出来呢?)
  11. 10.0.0.12 10.0.0.254 10.0.0.12 10.0.0.1
  12. [root@12 zx]#
复制代码
回复 9# wiliiwin


   
作者: wiliiwin    时间: 2014-10-07 18:23
djzhangxing 发表于 2014-10-07 18:03
对对~~(另外也感谢10楼哈),这个是不是应该用“或”呢?只要是2个条件有一个不满足就打印。但是我自己这么 ...

这个牵扯到短路,你要了解下&&和||的短路问题
作者: djzhangxing    时间: 2014-10-07 21:43
本帖最后由 djzhangxing 于 2014-10-07 21:58 编辑

好吧~~谢谢,我刚刚从网上看到一个介绍了,短路的问题像,对于 我这样的初学者,分享下》》》http://www.blogjava.net/myfly/archive/2008/08/28/225362.html《《《回复 12# wiliiwin


   
作者: djzhangxing    时间: 2014-10-08 06:29
本帖最后由 djzhangxing 于 2014-10-08 13:20 编辑

这篇介绍,更能易懂~http://m.blog.csdn.net/blog/snn1410/7496554
作者: liuxueyuanjwt    时间: 2014-10-08 09:03
我看了半天,还是没看懂楼主的意思。。看来我的语文也是体育老师教的。。
作者: djzhangxing    时间: 2014-10-08 11:42
嗯哈,之前的条件确实有点乱,我分布做开了~~哈哈!!回复 15# liuxueyuanjwt


   
作者: baoersc    时间: 2014-10-08 14:49
国庆节后快乐的工作




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2