首页 > 解决方案 > 根据最后一个点拆分并使用字符串的最后一部分创建一个新列

问题描述

我有一个包含 2 列的文件。在第一列中,有几个字符串 (ID),在第二个值中。在字符串中,有许多点是可变的。我想根据最后一个点拆分这些字符串。我在论坛中找到了如何删除最后一个点之后的最后一个过去,但我不想删除它。我想使用 bash 命令(例如 awk)用字符串的最后一部分创建一个新列

字符串示例:

   5_8S_A.3-C_1.A   50
   6_FS_B.L.3-O_1.A 20 
   H.YU-201.D   80
   UI-LP.56.2011.A  10 

输出示例:

   5_8S_A.3-C_1 A   50
   6_FS_B.L.3-O_1   A   20 
   H.YU-201 D   80
   UI-LP.56.2011    A   10

我试图通过使用以下命令来解决它,但如果我在字符串中只有 1 个点,它就可以工作:

awk -F' ' '{{split($1, arr, "."); print arr[1] "\t" arr[2] "\t" $2}}' file.txt

标签: awksplittabs

解决方案


你可以使用这个sed

sed -E 's/^([[:blank:]]*[^[:blank:]]+)\.([^[:blank:]]+)/\1 \2/' file

   5_8S_A.3-C_1 A   50
   6_FS_B.L.3-O_1 A 20
   H.YU-201 D   80
   UI-LP.56.2011 A  10

细节:

  • ^: 开始
  • ([[:blank:]]*[^[:blank:]]+):捕获组 #2 以匹配 0 个或多个空格,后跟 1+ 个非空格字符。
  • \.: 匹配一个点。由于这个正则表达式模式是贪婪的,它会匹配到最后一个点
  • ([^[:blank:]]+): 捕获组 #2 以匹配 1+ 个非空白字符
  • \1 \2:替换以在捕获值 #1 和捕获值 #2 之间放置一个空格

推荐阅读