我在txt文件中遇到数据操作问题。我的文件目前看起来像这样:
HG02239 -23.42333333
NA06985NA06985 -20.125
NA06991NA06991 -20.92
这显示了我的一些制表符分隔数据。一半条目使用正确的七个字符(letterletternumbernumbernumbernumbernumber)格式,但有些条目加倍。我想进入第二列(第一列是空的,原因!)并删除字符串中的重复以便它可以读取
HG02239 -23.42333333
NA06985 -20.125
NA06991 -20.92
我无法理解如何在每列的基础上使用sed / awk。我觉得我应该能写一个正则表达式,但因为数据是重复的,我不想丢失字符串的前半部分;我无法弄清楚如何剪切特定的列,或者我只是删除第7个字符。任何帮助非常感谢!
答案 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
是与第一个捕获组匹配的反向引用。答案 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