gpt4 book ai didi

linux - 在制表符分隔的文本文件中替换单个字符、破折号

转载 作者:太空狗 更新时间:2023-10-29 11:41:31 32 4
gpt4 key购买 nike

我正在使用 GNU bash 运行 Windows,版本 4.3.46(2)-release (x86_64-pc-msys)

可重现的例子

  • 我有一个很大的制表符分隔的文本文件,其中有很多行和列。这只是数据格式的一个例子

    echo -e 'Test-123\tA\tA\tC\t-\t-\tT\tG\t'
    Test-123 A A C - - T G

问题

  • 我只想用 N 替换 - 字符。如果该行的名称包含破折号,我需要保持原样。
  • 我想要的输出文件示例:

    Test-123        A       A       C       N       N       T       G

我尝试过的解决方案

  • 我尝试使用 sed 进行转义

    sed -e 's,\<-\>,N,g'
  • 没用,我查了一下前后的字符数,是一样的

    tr -cd - < test2_chr01.txt | wc -c

如有任何帮助,我们将不胜感激。

谢谢!

最佳答案

另一个 awk:

$ a='Test-123\tA\tA\tC\t-\t-\tT\tG\t' 
$ echo -e $a | awk 'BEGIN{FS=OFS="\t"}{for(i=1;i<=NF;i++)if($i=="-")$i="N"}1'
Test-123 A A C N N T G

解释:

awk '
BEGIN { FS=OFS="\t" } # delimiters
{
for(i=1;i<=NF;i++) # for each field
if($i=="-") # if a single dash
$i="N" # overwrite it
}1' # output

编辑:如果您正在寻找sed解决方案:

$ echo -e $a | sed -e 's/\B-\B/N/g' 
Test-123 A A C N N T G

显然 \B 仅适用于 GNU sed ( here )

另一个编辑:使用 perl 和 lookahead。如果 \t- 后跟 ,我们将其替换为 \tN。这样我们就可以避免重叠区域:

$ echo -e $a | perl -ne 's/\t-(?=\t)/\tN/g; print'
Test-123 A A C N N T G

关于linux - 在制表符分隔的文本文件中替换单个字符、破折号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45037270/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com