string - 如何删除字符串的双重部分?

标签 string sed awk

我在处理 txt 文件中的数据时遇到问题。我的文件目前如下所示:

    HG02239 -23.42333333
    NA06985NA06985  -20.125
    NA06991NA06991  -20.92

这显示了我的一些制表符分隔的数据。一半的条目采用正确的七字符 (letterletternumbernumbernumbernumbernumber) 格式,但有些条目是双倍的。我想进入第二列(第一列由于某种原因为空!)并删除字符串中的重复项,以便它读取

    HG02239 -23.42333333
    NA06985  -20.125
    NA06991  -20.92

我无法弄清楚如何在每列的基础上使用 sed/awk 来执行此操作。我觉得我应该能够编写正则表达式,但是因为数据是重复的,所以我不想丢失字符串的前半部分;我不知道如何剪切特定的列,或者我会删除第 7 个字符。非常感谢任何帮助!

最佳答案

解决方案

您可以通过反向引用来解决这个问题。例如,使用 GNU sed:

$ cat << EOF | sed --regexp-extended 's/(.{7})\1/\1/'
HG02239 -23.42333333
NA06985NA06985  -20.125
NA06991NA06991  -20.92
EOF

HG02239 -23.42333333
NA06985 -20.125
NA06991 -20.92

如果您不使用 GNU sed,您可能需要转义捕获组。此外,如果您需要更准确的字符匹配,您可以调整正则表达式。

说明

cat 管道只是一个此处文档,以便于显示和测试代码。您可以直接在文件上调用 sed,或者在您对结果感到满意时使用 -i 标志执行就地编辑。

sed 脚本执行以下操作:

  1. 它使用“间隔表达式”(大括号中的数字)将任意 7 个连续字符存储在捕获组中。
  2. \1 是与第一个捕获组匹配的反向引用。
  3. 匹配查找“捕获组,后跟捕获组的副本。”
  4. 替换将匹配项替换为捕获组的单个副本。

关于string - 如何删除字符串的双重部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11431731/

相关文章:

java - 关于Java的字符串池的问题

c# - 如何在自己的方法中模仿string.Format()?

mysql - 删除 csv 文件中最多第 N 个模式匹配实例的文本

bash - awk 如何将 unix 命令的结果作为参数?

shell - 在 Solaris 上替代 `sed -i`

awk - 如果 AWK 中有特定字符,如何加入下一行?

javascript - 如何将 json.stringify() 分配给 javascript 变量

c - C 程序永远不会从 strtok() 函数返回的问题

linux - sed 将 "_"、 "&"、 "$"分别替换为 "\_"、 "\&"、 "\$"

awk - 仅使用 awk 和 sed 修改第 2 列