shell 删除文件中前面重复的数字- bash

68bkxrlz  于 2023-06-24  发布在  Shell
关注(0)|答案(4)|浏览(146)

在“BEFORE FILE”下面的文本文件中,如何删除重复的数字,使其看起来像下面的“AFTER FILE”?“_PRODxxxx”(其中x是数字)将保持该格式。
存档前

NET_SalesD_PROD1111,mexico
NET_Sales4_PROD22,newjersy
NET_SalesG_PROD333,bull

文件后

NET_SalesD_PROD1,mexico
NET_Sales4_PROD2,newjersy
NET_SalesG_PROD3,bull

我尝试使用sed和正则表达式捕获组,如“PROD[1-9]{2,4}”,但无法使其工作。

sbdsn5lh

sbdsn5lh1#

使用捕获组来捕获第一个数字,并使用反向引用来匹配它的重复。然后在替换中使用相同的反向引用来生成其中的一个。

sed -E 's/PROD([1-9])\1+,/PROD\1,/'
lg40wkob

lg40wkob2#

***第一个解决方案:***如果你对Perl没问题,那么就用正则表达式和捕获组功能,然后在正则表达式中使用贪婪匹配和懒惰匹配功能来实现所需的输出。

perl -pe 's|^(.*_)(.*?)(\d)\3*(,.*)$|${1}${2}${3}${4}|'  Input_file

***第二种解决方案:***在perl中使用简单的替换,使用捕获组来查找重复项,并将其替换为自身,然后是,

perl -pe 's|([0-9])\1*,|\1,|'  Input_file
b09cbbtk

b09cbbtk3#

假设:

  • 所有行都包含字符串_PROD[0-9]+,
  • 我们(实际上)希望保留_PROD之后的第一个数字

一种sed方法:

$ sed -E 's/(_PROD[0-9])[0-9]*/\1/' x
NET_SalesD_PROD1,mexico
NET_Sales4_PROD2,newjersy
NET_SalesG_PROD3,bull

其中:

  • (_PROD[0-9])-(第一个)捕获组匹配字符串_PROD<single_digit>,后跟...
  • [0-9]*-零位或多位
  • \1-用(第一个)捕获组替换匹配项
vwkv1x7d

vwkv1x7d4#

很长的路,如果你想awk它:

awk -vc="PROD" '{

      split($1,h1,c)
      split(h1[2],h2,",")

      print h1[1]""c""substr(h2[1],1,1)","h2[2]

 }'

相关问题