【问题标题】:How to delete certain pattern in a record?如何删除记录中的某些模式?
【发布时间】:2015-06-22 09:13:40
【问题描述】:

我有一个文件,其中有数百个以以下格式记录:

20150416110321|21,VPLA,91974737XXX5|91974737XXX5,404192086271201|404192086271201,SAI-IMEISV,gsn65.xxxxx.com,gsn65.xxxxx.com;1429148977;301814701;11276100,100.XX.199.250|100.XX.199.XXX|,1,SAIOLU-Location,SAIOLU-LG,2,internet|internet,,SAIOLU-SGSNIP,6,AL,AL_F_1_25G40K_2_25G20K_28|KL_BASIC,,UNKNOWN,SAIOLU-MK,UNKNOWN,SAIOLU-MBRUL,SAIOLU-MBRDL,,,,SAI-IMEI,,,,

我只想获取字段/列 1-8 中管道分隔数据的第一部分。如何使用 awk/sed 做到这一点?

例如:

20150416110321,VPLA,91974737XXX5,404192086271201,SAI-IMEISV,gsn65.xxxxx.com;1429148977;301814701;11276100,100.XX.199.250,1,SAIOLU-Location,SAIOLU-LG,2,internet|internet,,SAIOLU-SGSNIP,6,AL,AL_F_1_25G40K_2_25G20K_28|KL_BASIC,,UNKNOWN,SAIOLU-MK,UNKNOWN,SAIOLU-MBRUL,SAIOLU-MBRDL,,,,SAI-IMEI,,,,

谢谢

【问题讨论】:

  • @Ed Morton :嗨,请仔细阅读问题,我写了我有一个包含数百条记录的文件,格式如下。其次,这是要求在输出中应取管道的第一部分。我希望我回答了您的问题,谢谢

标签: perl shell awk sed


【解决方案1】:

你可以使用 awk。

$ awk -F, -v OFS="," '{for(i=1;i<=8;i++)sub(/\|.*/,"",$i)}1' file
20150416110321,VPLA,91974737XXX5,404192086271201,SAI-IMEISV,gsn65.xxxxx.com,gsn65.xxxxx.com;1429148977;301814701;11276100,100.XX.199.250,1,SAIOLU-Location,SAIOLU-LG,2,internet|internet,,SAIOLU-SGSNIP,6,AL,AL_F_1_25G40K_2_25G20K_28|KL_BASIC,,UNKNOWN,SAIOLU-MK,UNKNOWN,SAIOLU-MBRUL,SAIOLU-MBRDL,,,,SAI-IMEI,,,,

【讨论】:

  • 感谢您的回复。它对我有用。我又多了一个查询:在 awk 中是否有“sed -i”的等价物。我的意思是我只想在这个文件中写入这些更改而不重定向它..
  • 最好使用 awk,因为您想在有限的字段上进行替换,即最多 8 个。
  • 是的,我只想使用 awk,但想在同一个文件中再次写入更改。所以我问有没有像我们在 sed 中那样的“-i”选项类型。无论如何,感谢上述解决方案,它按要求工作。 !!!
  • @JID 实际上是-i inplace in gawk。 -i 参数告诉 gawk 包含一个库,就像在 gawk 脚本中使用 @include 一样。 -iinplace 选项告诉 gawk 要包含的库是用于就地编辑的库。 sed 和 awk 都具有 -i arg 的事实完全是巧合,而且有点不幸,因为它们的含义完全不同。
  • @EdMorton 对,谢谢!反正我用不了,因为我只有 3.2 :(
【解决方案2】:
sed ':cycle
s/^\(\([^,]*,\)\{0,7\}[^,|]*\)|[^,]*/\1/;t cycle' YourFile

递归删除 | 和下一个 , 之间的所有内容,前 8 组由 , 分隔

【讨论】:

  • 嗨@NeronLe 感谢您分享命令。这正是我一直在寻找的。可以编辑文件本身的 sed 命令。但我在这里面临一个问题。当我正常运行命令时,它在命令行中运行良好,但是当我在脚本中运行它时,它没有显示任何错误或任何输出。 #!/usr/bin/perl 我的 $cmd2 =sed -i ':cycle s/^\(\([^,]*,\)\{0,13\}[^,|]*\)|[^,]*/\1/\;t cycle' vpl ;系统($cmd2);
  • 当然是shell解释,你需要转义一些部分。尝试在命令中以 sed 的形式使用set -vx; 进行调试。您也可以将 sed 操作放在一个文件中并通过sed -i -f YourSedAction.file vpl 调用它。现在,从 perl 调用,肯定有更好的方法直接在 perl 本身中
  • 你能告诉我如何在 perl 脚本中实现这一点吗?我以为我需要在 perl 脚本中使用 sed ?
  • 很抱歉,perl 不在我的专业范围内:-(
  • @Ed Morton 嗨 Morton,是的,我正在查看您所写的内容,因为现有脚本是用 perl 编写的,我只需要按照我在问题中的解释进行修改 && 是的,这是一个错误我的观点是我没有在其中标记“perl”。对此深表歉意!谢谢
猜你喜欢
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 2014-05-15
相关资源
最近更新 更多