使用if构造对行进行排序和分组

时间:2016-01-25 13:59:37

标签: bash awk sed grep

这是我的输入文件

otf.msn.com
otf.msn.com
accounts.google.com
Email=adresemail@gmail.com
www.x-kom.pl
login=przykladowyuzytkownik
allegro.pl
ssl.allegro.pl
www.bing.com
www.bing.com
www.bing.com
www.bing.com
store.steampowered.com
username=steamuser
logowanie.interia.pl
login.live.com
login=mailhotmail@hotmail.com
www.bing.com

我需要与用户名/用户/登录和站点地址建立关系。 站点地址始终位于用户/电子邮件/登录之上。条件可以是=符号。

如果行包含= 然后这行=用户      上面的行(第1行)=网站

我想要的是连接用户和网站的文件。 输出可以是txt文件。用户和网站可以像一行一样f.e

accounts.google.com - Email = adresmail@gmail.com

或者喜欢我的输入文件

accounts.google.com 
Email=adresmail@gmail.com
store.steampowered.com
username=steamuser

问题是:我怎样才能达到这个条件? 我的意思是我是awk / grep / sed的新手,不知道如何构建if条件。 如何获得包含= /如何使关联beetwen与=和上面的行相交的行之上的行? 简而言之 将包含=的每一行与上面的行分组。将此输出到文件。

谢谢:)

3 个答案:

答案 0 :(得分:1)

这个怎么样:

$ grep = input.txt -B1 | grep -v -e "--" | sed "N;s/\n/ - /"

答案 1 :(得分:1)

awk救援!

$ awk '/=/{print p "\t" $0} {p=$0}' file | column -t

accounts.google.com     Email=adresemail@gmail.com
www.x-kom.pl            login=przykladowyuzytkownik
store.steampowered.com  username=steamuser
login.live.com          login=mailhotmail@hotmail.com

答案 2 :(得分:0)

我认为以“被问到”的方式回答这个问题是不值得的,但它满足了我对hack sed的necrophiliac热情。所以请原谅我,我忍不住回答这个问题。

#! /bin/sh
sed -n "
/^Email/{
 H;g;s/\nEmail=/ /p
}
h" <<EOF
otf.msn.com
otf.msn.com
accounts.google.com
Email=adresemail@gmail.com
www.x-kom.pl
login=przykladowyuzytkownik
allegro.pl
ssl.allegro.pl
www.bing.com
www.bing.com
www.bing.com
www.bing.com
store.steampowered.com
username=steamuser
logowanie.interia.pl
login.live.com
login=mailhotmail@hotmail.com
www.bing.com
EOF

输出是:

accounts.google.com adresemail@gmail.com

如果行以Email附加模式空间以保留空间,则将保留空间复制到模式空间,替换关键字并打印结果。下一个复制保留空间以模式空间。