2

我在 txt 文件中进行数据操作时遇到问题。我的文件目前看起来像这样:

    HG02239 -23.42333333
    NA06985NA06985  -20.125
    NA06991NA06991  -20.92

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

    HG02239 -23.42333333
    NA06985  -20.125
    NA06991  -20.92

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

4

3 回答 3

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

sed 脚本执行以下操作:

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

一种方法,使用awk

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

输出:

HG02239 -23.42333333
NA06985 -20.125
NA06991 -20.92
于 2012-07-11T12:15:43.207 回答
0

你可以使用类似的东西:

sed -i 's|\([A-Z]\{2\}[0-9]\{5\}\)[A-Z0-9]*\s*\(.*\)|\1 \2|g' <your-file>
于 2012-07-11T11:56:41.173 回答