如何删除字符串的加倍部分?

时间:2012-07-11 11:31:57

标签: 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个字符。任何帮助非常感谢!

3 个答案:

答案 0 :(得分:2)

解决方案

您可以使用反向引用来解决此问题。例如,使用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管道只是一个here-document,可以很容易地显示和测试代码。您可以直接在您的文件上调用sed,或者在您对结果感到满意时使用 -i 标记执行就地编辑。

sed脚本执行以下操作:

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

答案 1 :(得分:0)

你可以使用类似的东西:

sed -i 's|\([A-Z]\{2\}[0-9]\{5\}\)[A-Z0-9]*\s*\(.*\)|\1 \2|g' <your-file>

答案 2 :(得分:0)

单向,使用awk

awk '{ print substr($1, 1, 7), $2 }' file.txt

输出:

HG02239 -23.42333333
NA06985 -20.125
NA06991 -20.92