我有一个用竖线分隔的文件,第三列中有一个电子邮件地址。我需要帮助使用 awk 或 sed 命令从第三列中的电子邮件地址的域名中创建第四列。
输入文件
TEST|1234|[email protected]
TEST|4533|[email protected]
TEST|9030|[email protected]
TEST|0903|[email protected]
预期产出
TEST|1234|[email protected]|gmail.com
TEST|4533|[email protected]|yahoo.com
TEST|9030|[email protected]|gmx.com
TEST|0903|[email protected]|gmail.com
答案1
尝试这个,
awk -F '@' '{print $0"|"$NF}' file
TEST|1234|[email protected]|gmail.com
TEST|4533|[email protected]|yahoo.com
TEST|9030|[email protected]|gmx.com
TEST|0903|[email protected]|gmail.com
答案2
使用sed
:
$ sed 's/@\(.*\)/&|\1/' file
TEST|1234|[email protected]|gmail.com
TEST|4533|[email protected]|yahoo.com
TEST|9030|[email protected]|gmx.com
TEST|0903|[email protected]|gmail.com
这将匹配@
每行的第一个字符,并使用捕获组捕获其后的所有内容。匹配的文本将被自身替换,后跟捕获的文本,|
中间有一个字符。
如果您的文件是 DOS 文本文件(如某些评论所示),那么您可以使用同一个命令将其转换为 Unix 文本文件:
$ sed -e 's/[[:cntrl:]]$//' -e 's/@\(.*\)/&|\1/' file
TEST|1234|[email protected]|gmail.com
TEST|4533|[email protected]|yahoo.com
TEST|9030|[email protected]|gmx.com
TEST|0903|[email protected]|gmail.com
第二次替换与之前相同,但第一次替换将删除行末尾的任何控制字符(这将删除每行末尾的回车符,如果有的话)。无论原始文件是 DOS 还是 Unix 文本文件,最后一个命令的输出都将是 Unix 文本文档。
答案3
尝试使用下面的脚本
for i in `cat o.txt`; do y=`echo $i |awk -F "|" '{print $NF}'| awk -F "@" '{print $NF}'`; echo $i | awk -v y="$y" '{print $0"|"y}'; done
输出
TEST|1234|[email protected]|gmail.com
TEST|4533|[email protected]|yahoo.com
TEST|9030|[email protected]|gmx.com
TEST|0903|[email protected]|gmail.com