我想删除字符串"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
我检查了以前的线程并尝试了:
sed 's/^chr//' awk 'BEGIN {OFS=FS="t"} {gsub(/chr1/,"1",$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 将非常缓慢