分页: 1 / 1

列表处理

发表于 : 2011-09-02 16:10
mad_frog
小弟还有个问题,麻烦给位帮我看下

list1、list2、list3、list4,
如果list1、list2中有相同的ip,则在list1中相同IP后面追加a 放到listnew中
如果list1、list3中有相同的ip,则在list1中相同IP后面追加b 放到listnew中
如果list1、list4中有相同的ip,则在list1中相同IP后面追加b 放到listnew中

list1
1.1.1.1
2.2.2.2
3.3.3.3
4.4.4.4
5.5.5.5

list2
1.1.1.1
2.2.2.2

list3
3.3.3.3
4.4.4.4

list4
5.5.5.5
结果是:
listnew
1.1.1.1 a
2.2.2.2 a
3.3.3.3 b
4.4.4.4 b
5.5.5.5 c

Re: 列表处理

发表于 : 2011-09-02 16:13
eexpress
你合并list2-4再说嘛。

Re: 列表处理

发表于 : 2011-09-02 16:21
mad_frog
eexpress 写了:你合并list2-4再说嘛。
合并后怎么判断呢,因为各个列表都是不同功能的IP

Re: 列表处理

发表于 : 2011-09-02 16:33
sk1418
合并省事点,你要是非不合并这个也行:


代码: 全选

  awk 'ARGIND==1{a[$0]=1;next;} 
    ARGIND==2{ if($0 in a)print $0" a">>"listnew.txt";next; }
    ARGIND==3{ if($0 in a)print $0" b">>"listnew.txt";next; }
    ARGIND==4{ if($0 in a)print $0" c">>"listnew.txt"; }
' list1 list2 list3 list4

Re: 列表处理

发表于 : 2011-09-02 16:34
eexpress
mad_frog 写了:
eexpress 写了:你合并list2-4再说嘛。
合并后怎么判断呢,因为各个列表都是不同功能的IP
从你的格式要求来说,合并最简单,然后不就是之前的sort uniq嘛。

Re: 列表处理

发表于 : 2011-09-02 17:01
mad_frog
sk1418 写了:合并省事点,你要是非不合并这个也行:


代码: 全选

  awk 'ARGIND==1{a[$0]=1;next;} 
    ARGIND==2{ if($0 in a)print $0" a">>"listnew.txt";next; }
    ARGIND==3{ if($0 in a)print $0" b">>"listnew.txt";next; }
    ARGIND==4{ if($0 in a)print $0" c">>"listnew.txt"; }
' list1 list2 list3 list4


谢谢,对我很有帮助

Re: 列表处理

发表于 : 2011-09-02 17:05
我就是我2
[bash]
#!/bin/bash
origin=list1
for o in list{2..4};do
cp $origin bak$o
for i in `diff $origin $o | awk '/^</{print $2}'`;do
sed "/$i/d" -i bak$o
done
sed "s/$/ $o/" bak$o >>listnew
done
rm baklist? -f
sed 's/list2/a/g;s/list3/b/g;s/list4/c/g' -i listnew
cat listnew
[/bash]
:em20 :em20
这方法真笨.
.哎
似乎标错了.再修改一下.
list1依次和每个list2/3/4 diff
找出不同的并删除,剩下的就是相同的.标记相同的

Re: 列表处理

发表于 : 2011-09-02 17:12
sk1418
mad_frog 写了:
sk1418 写了:合并省事点,你要是非不合并这个也行:


代码: 全选

  awk 'ARGIND==1{a[$0]=1;next;} 
    ARGIND==2{ if($0 in a)print $0" a">>"listnew.txt";next; }
    ARGIND==3{ if($0 in a)print $0" b">>"listnew.txt";next; }
    ARGIND==4{ if($0 in a)print $0" c">>"listnew.txt"; }
' list1 list2 list3 list4


谢谢,对我很有帮助
严格说,这个不是100%符合你的要求,我偷懒了,这个只是把所有匹配的内容弄到新文件了。你要求是以list1为根本,也就是如果list1里有个200.200.200.200,list2,3,4里都没有的,这个200。。。也应该在结果文件,只是没有后缀。

你可以自己按这个意思改,就是个awk数组的事。

Re: 列表处理

发表于 : 2011-09-02 20:28
fnan
如果list1、list4中有相同的ip,则在list1中相同IP后面追加b 放到listnew中
#后面追加c。

Re: 列表处理

发表于 : 2011-09-02 20:30
我就是我2
fnan 写了:
如果list1、list4中有相同的ip,则在list1中相同IP后面追加b 放到listnew中
#后面追加c。
:em20 :em20 :em20
没看清楚.也想当然了.

Re: 列表处理

发表于 : 2011-09-02 21:11
fnan
我就是我2 写了:[bash]
#!/bin/bash
for o in list{2..4};do
cp $origin bak$o
for i in `diff $origin $o | awk '/^</{print $2}'`;do
sed "/$i/d" -i bak$o
done
sed "s/$/ $o/" bak$o >>listnew
done
rm baklist? -f
sed 's/list2/a/g;s/list3/b/g;s/list4/c/g' -i listnew
cat listnew
[/bash]
:em20 :em20
这方法真笨.
.哎
似乎标错了.再修改一下.
list1依次和每个list2/3/4 diff
找出不同的并删除,剩下的就是相同的.标记相同的
#for可以参考一下这个:
for f in list{2..4};do sort list1 $f|uniq -d|xargs -i echo {} $(tr 234 abc <<<${f/list/});done;sort list{1..4}|uniq -u

Re: 列表处理

发表于 : 2011-09-02 22:31
我就是我2
${f/list/}
高级货.第一次见到 :em06
i=j.jpg.jpg.jpg.jpg
${i/%.jpg/.gif}
替换
转格式之类...名字有新招了.
sort list{1..4}|uniq -u
后三个文件的内容是第一个内容的子集?所以无输出?
// 空行也算一元素...?

Re: 列表处理

发表于 : 2011-09-03 2:46
fnan
没看8楼啊。

Re: 列表处理

发表于 : 2011-09-03 8:38
我就是我2
fnan 写了:没看8楼啊。
知道了. :em06