0

我有一个文本文件,每行有 1 个或多个电子邮件 ID。例如

id:123, name:test, id: 5678, name john, address:new york  
id:567, name:bob  
id:3643, name:meg, id: 6721, name kate, address:la  

现在,问题是 id:value 可能在一行中出现一次或多次。如何提取所有 id:value 对,以便输出是,

id:123, id:5678  
id:567  
id:3643, id:6721  

我试过egrep -o了,但那是把每一id:value对放在一个单独的行中。

sed/awk应该做的伎俩,但我是菜鸟

不想使用Perl,因为这需要安装 Perl。

编辑: 在进一步分析数据文件时,我看到分隔符不一致,即并非所有行都是,分开的。有些甚至用:and分隔|。此外,,出现在地址值字段中。即address:52nd st, new york。这可以通过awk使用正则表达式来完成吗?

4

5 回答 5

2

这可能对您有用(GNU sed):

sed -r 's/\<id:\s*/\n/g;s/,[^\n]*//g;s/\n/, id:/g;s/^, //' file

将单词id:和任何后续空格转换为唯一标记(在本例中\n)。删除 a 到 a 之后的,任何内容\n\n用标记替换, id:,然后删除前导,.

于 2013-07-20T09:57:30.197 回答
2

如果您的内容在文件中,test.txt则使用以下命令:

cat test.txt | sed 's/ *: */:/g' | grep -o 'id:[0-9]*'

将返回:

id:123
id:5678
id:567
id:3643
id:6721

sed 命令用于删除与冒号相邻的所有空格,产生以下输出:

id:123, name:test, id:5678, name john, address:new york
id:567, name:bob
id:3643, name:meg, id:6721, name kate, address:la

并且该grep -o命令会查找所有以id:零个或多个数字开头的匹配项,并且-o仅返回输入字符串的匹配部分。

根据手册页:

-o, --only-matching    Print only the matched (non-empty) parts of a matching 
                       line, with each such part on a separate output line.

(仅供参考,grep 和 sed 命令使用正则表达式。)

编辑: 对不起,我没有仔细阅读。我看到您反对-o每行一个值的输出格式。回到绘图板...

注意:如果您反对-o输出的原因是为了保留行号,则 usinggrep -no将给出以下输出(其中第一个数字是行号):

1:id:123
1:id:5678
2:id:567
3:id:3643
3:id:6721

也许这有帮助?

于 2013-07-19T03:54:07.530 回答
1

这应该有效:

 awk -F, '{id=0;for(i=1;i<=NF;i++) if($i~/id:/) id=id?id FS $i:$i; print id}' file

测试:

$ cat file
id:123, name:test, id: 5678, name john, address:new york  
id:567, name:bob  
id:3643, name:meg, id: 6721, name kate, address:la  

$ awk -F, '{id=0;for(i=1;i<=NF;i++) if($i~/id:/) id=id?id FS $i:$i; print id}' file
id:123, id: 5678
id:567
id:3643, id: 6721
于 2013-07-19T03:55:27.233 回答
0
perl -lne 'push @a,/id:[^,]*/g;print "@a";undef @a' your_file

测试如下:

> cat temp
id:123, name:test, id: 5678, name john, address:new york  
id:567, name:bob  
id:3643, name:meg, id: 6721, name kate, address:la  
> perl -lne 'push @a,/id:[^,]*/g;print "@a";undef @a' temp
id:123 id: 5678
id:567
id:3643 id: 6721
>
于 2013-07-19T05:57:20.810 回答
0

这只是一个已经给出的答案的变体..我个人更喜欢文件中的脚本版本而不是命令行(更好的控制,可读性)

id.txt

id:1, name:test, id:2, name john, address: 纽约  
编号:3,姓名:鲍勃  
id:4, name:meg, id:5, name kate, 地址:la  

身份证件

{
i=0
for(i=1;i<=NF;i++)
{ if($i~/id:/)
id=id?id $i:$i;}
print id
id=""
}

调用:awk -f id.awk id.txt
输出:

编号:1,编号:2,
编号:3,
编号:4,编号:5,
于 2013-07-19T12:21:33.083 回答