分页: 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]
这方法真笨.
.哎
似乎标错了.再修改一下.
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。
没看清楚.也想当然了.
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]
这方法真笨.
.哎
似乎标错了.再修改一下.
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/}
高级货.第一次见到
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楼啊。
知道了.
