我在处理 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 脚本执行以下操作:
- 它使用“间隔表达式”(大括号中的数字)将任意 7 个连续字符存储在捕获组中。
\1
是与第一个捕获组匹配的反向引用。- 匹配查找“捕获组,后跟捕获组的副本。”
- 替换将匹配项替换为捕获组的单个副本。
关于string - 如何删除字符串的双重部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11431731/