unix - 找到一个字符串并使用 awk 将其附加到下一行

标签 unix sed awk

输入文件:

DAN|a@gmail.com,c@yahoo.co.in,abc@gmail.com  
NAB|a@gmail.com  
PAT|a@gmail.com  
DAN|y@gmail.com  
NAB|y@yahoo.in  
PAT|z@redhat.com,abc@gmail.com  
DAN|y@gmail.com,abc@gmail.com  
NAB|b@yahoo.co.in  
PAT|c@uix.xo.in  
DAN|y@gmail.com  
NAB|b@yahoo.co.in  
PAT|c@uix.xo.in  

考虑第一行,有多个记录以“,”分隔。查找 ',' 分隔的记录。如果在第一行找到了 ',' 分隔记录,则将其放入下一行并附加 'DAN|',无论开头的字符串是什么,都应该附加。所以输出应该是:
DAN|a@gmail.com  
DAN|c@yahoo.co.in     
DAN|abc@gmail.com  
NAB|a@gmail.com  
PAT|a@gmail.com  
DAN|y@gmail.com  
NAB|y@yahoo.in  
PAT|z@redhat.com  
PAT|abc@gmail.com  
DAN|y@gmail.com  
DAN|abc@gmail.com  
NAB|b@yahoo.co.in  
PAT|c@uix.xo.in  
DAN|y@gmail.com  
NAB|b@yahoo.co.in  
PAT|c@uix.xo.in 

最佳答案

这是使用 awk 的一种方法, 使用两个分隔符:

awk -F "[|,]" '{ for (i=2;i<=NF;i++) print $1 "|" $i }' file

这是使用单个分隔符的另一种方法:
awk -F, '{ for (i=1;i<=NF;i++) print (i>1 ? substr($0,0,4) : "") $i }' file

结果:
DAN|a@gmail.com
DAN|c@yahoo.co.in
DAN|abc@gmail.com  
NAB|a@gmail.com  
PAT|a@gmail.com  
DAN|y@gmail.com  
NAB|y@yahoo.in  
PAT|z@redhat.com
PAT|abc@gmail.com  
DAN|y@gmail.com
DAN|abc@gmail.com  
NAB|b@yahoo.co.in  
PAT|c@uix.xo.in  
DAN|y@gmail.com  
NAB|b@yahoo.co.in  
PAT|c@uix.xo.in  

关于unix - 找到一个字符串并使用 awk 将其附加到下一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15000530/

相关文章:

linux - 查找带有重音字符的 unix 文件

c - 在C中获取当前进程CPU使用率

linux - 计算唯一字符的数量并列出每行的当前计数

linux - sed – 搜索下划线等特殊字符并用破折号替换

bash:模式 x 和 y 之间的单独行 block

unix - Amazon EC2 的替代工具?

regex - 使用正则表达式通过 Bash 检查范围

awk - awk 函数体中数组长度失败

在 l 命令的末尾添加额外的字符

linux - 如何使用 awk 删除 file1 的行,其第 1 列值存在于 Ubuntu 的 file2 中?