只删除txt文件中的部分字符行-chr字符串



我想删除字符串"chr";在以下txt文件中,使用bash:

FO538757.1      chr1:183937
AL669831.3      chr1:601436
AL669831.3      chr1:601667
AL669831.3      chr1:609395
AL669831.3      chr1:609407
AL669831.3      chr1:611317

所以结束文件看起来像:

FO538757.1      1:183937
AL669831.3     1:601436
AL669831.3     1:601667
AL669831.3     1:609395
AL669831.3     1:609407
AL669831.3     1:611317
  1. 我检查了以前的线程并尝试了:

    sed 's/^chr//' 
    awk 'BEGIN {OFS=FS="t"} {gsub(/chr1/,"1",$2)}2'
    
  2. 它们都不起作用。还有比awk更好的选择吗?

谢谢!

我怀疑您真正需要的只是:

sed 's/chr//' file

使用sed和两个表达式可以很容易地做到这一点,(1(第一个删除chr,第二个删除前导空白,例如

sed -e 's/chr//' -e 's/^[[:blank:]]*//'  file

示例使用/输出

在名为file的文件中输入后,您将获得

$ sed -e 's/chr//' -e 's/^[[:blank:]]*//'  file
FO538757.1      1:183937
AL669831.3      1:601436
AL669831.3      1:601667
AL669831.3      1:609395
AL669831.3      1:609407
AL669831.3      1:611317

使用您显示的示例,请尝试以下操作。简单的解释是:将第二个字段中的起始chr替换为NULL,然后打印行,这将导致当前行的重建,并且行中的初始空格也将被删除。

awk '{sub(/^chr/,"",$2)} 1' Input_file

如果您的Input_file是制表符分隔的,并且在文件的开头有制表符,请尝试以下操作:

awk 'BEGIN{FS=OFS="t"} {sub(/^chr/,"",$3);sub(/^t+/,"")} 1' Input_file

使用带参数扩展的bash外壳和mapfile(也称为readarray(

#!/usr/bin/env bash
shopt -s extglob
mapfile -t array < file.txt
array=("${array[@]##+([[:space:]])}")
printf '%sn' "${array[@]/chr}"

脚本内部必须启用extglob,但在命令行中它可能已经启用,因此在一行中

mapfile -t array < file.txt; array=("${array[@]##+([[:space:]])}"); printf '%sn' "${array[@]/chr}"

对于大型数据/文件集,jfyi 将非常缓慢