如何从文件中仅删除特定字段中的电子邮件地址?

如何从文件中仅删除特定字段中的电子邮件地址?

我试图仅删除第七个字段中的电子邮件地址。我尝试通过 sed 执行此操作,但我无法选择/选择我想要删除的 col。我想删除第七个字段中出现的所有电子邮件地址。

输入文件:

980||||||[email protected]||77880|GB||0CA005D||
7980||||||[email protected]||5656|PO||69B88008BE||
100||||||[email protected]||31000|USA||0C5D||
101||||||||3100df0|CAN||0C5D||
570||||||[email protected]||5521123|RSA||B70F2||
080570||||||[email protected]||AV6777|OI||A005D||
1870||||||USA||5521123|RSA||B70F2||
 70||||||RABBIT||AV6777|OI||A005D||

输出:

980||||||||77880|GB||0CA005D||
7980||||||||5656|PO||69B88008BE||
100||||||||31000|USA||0C5D||
101||||||||3100df0|CAN||0C5D||
570||||||||5521123|RSA||B70F2||
080570||||||||AV6777|OI||A005D||
1870||||||USA||5521123|RSA||B70F2||
70||||||RABBIT||AV6777|OI||A005D||

这就是我试图达到的结果,但我无法达到目标。

sed 's/,[a-z][0-9]\@[a-z][0-9]\.[a-z]//' file

答案1

(在问题中添加更多要求后编辑了脚本。)

awk -F '|' -v OFS='|' '$7 ~ /@/ { $7 = "" } { print }' file

解释:

-F '|' -v OFS='|'设置输入和输出字段分隔符
$7 ~ /@/条件:第 7 列包含@
{ $7 = "" }操作:将第 7 列设置为空字符串
{ print }无条件操作:打印该行

该脚本假设第 7 列中包含 a 的所有内容@都是电子邮件地址,并且没有不属于该电子邮件地址的其他数据。

正如 Valentin Bajrami 的评论中所述,您可以省略该print语句并添加另一个包含 only 的规则1,这是一个1具有隐式默认操作的“始终为真”条件 ( ) print

awk -F '|' -v OFS='|' '$7 ~ /@/ { $7 = "" } 1' file

注意:与问题的(编辑的)示例输出相比,脚本不会删除示例输入最后一行中的前导空白。

答案2

尝试这个。

awk -F\| -vOFS=\| '$7="";1'

答案3

使用简化的电子邮件正则表达式将第 6 次出现的|plus 可选电子邮件地址替换为|(使第 7 个字段中的非电子邮件地址保持不变):

sed 's/|\([^|@]\+@[^|@]\+\.[a-zA-Z]\{2,\}\)\?/|/6' file
  • s/代替
  • |匹配字面量|
  • \(开始组
  • [^|@]\+匹配一个或多个非|和非@字符( 之前的所有字符@
  • @匹配字面量@
  • [^|@]\+与上面两行相同
  • \.匹配一个点
  • [a-zA-Z]\{2,\}匹配 2 个或更多字母
  • \)端基
  • \?匹配零个或一组
  • /|/用。。。来代替|
  • 6匹配第 6 次出现的模式

相关内容