列表处理

sh/bash/dash/ksh/zsh等Shell脚本
回复
mad_frog
帖子: 55
注册时间: 2011-06-29 11:26

列表处理

#1

帖子 mad_frog » 2011-09-02 16:10

小弟还有个问题,麻烦给位帮我看下

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
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 列表处理

#2

帖子 eexpress » 2011-09-02 16:13

你合并list2-4再说嘛。
● 鸣学
mad_frog
帖子: 55
注册时间: 2011-06-29 11:26

Re: 列表处理

#3

帖子 mad_frog » 2011-09-02 16:21

eexpress 写了:你合并list2-4再说嘛。
合并后怎么判断呢,因为各个列表都是不同功能的IP
sk1418
帖子: 229
注册时间: 2007-07-01 17:36
系统: (En):System
来自: (En):address
联系:

Re: 列表处理

#4

帖子 sk1418 » 2011-09-02 16:33

合并省事点,你要是非不合并这个也行:


代码: 全选

  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
---
regards,

Kent
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 列表处理

#5

帖子 eexpress » 2011-09-02 16:34

mad_frog 写了:
eexpress 写了:你合并list2-4再说嘛。
合并后怎么判断呢,因为各个列表都是不同功能的IP
从你的格式要求来说,合并最简单,然后不就是之前的sort uniq嘛。
● 鸣学
mad_frog
帖子: 55
注册时间: 2011-06-29 11:26

Re: 列表处理

#6

帖子 mad_frog » 2011-09-02 17:01

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


谢谢,对我很有帮助
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: 列表处理

#7

帖子 我就是我2 » 2011-09-02 17:05

[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
找出不同的并删除,剩下的就是相同的.标记相同的
上次由 我就是我2 在 2011-09-02 22:36,总共编辑 6 次。
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
sk1418
帖子: 229
注册时间: 2007-07-01 17:36
系统: (En):System
来自: (En):address
联系:

Re: 列表处理

#8

帖子 sk1418 » 2011-09-02 17:12

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数组的事。
---
regards,

Kent
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 列表处理

#9

帖子 fnan » 2011-09-02 20:28

如果list1、list4中有相同的ip,则在list1中相同IP后面追加b 放到listnew中
#后面追加c。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: 列表处理

#10

帖子 我就是我2 » 2011-09-02 20:30

fnan 写了:
如果list1、list4中有相同的ip,则在list1中相同IP后面追加b 放到listnew中
#后面追加c。
:em20 :em20 :em20
没看清楚.也想当然了.
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 列表处理

#11

帖子 fnan » 2011-09-02 21:11

我就是我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
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: 列表处理

#12

帖子 我就是我2 » 2011-09-02 22:31

${f/list/}
高级货.第一次见到 :em06
i=j.jpg.jpg.jpg.jpg
${i/%.jpg/.gif}
替换
转格式之类...名字有新招了.
sort list{1..4}|uniq -u
后三个文件的内容是第一个内容的子集?所以无输出?
// 空行也算一元素...?
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 列表处理

#13

帖子 fnan » 2011-09-03 2:46

没看8楼啊。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: 列表处理

#14

帖子 我就是我2 » 2011-09-03 8:38

fnan 写了:没看8楼啊。
知道了. :em06
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
回复