Shell 如何在unix中从中行列值中删除字符串

Shell 如何在unix中从中行列值中删除字符串,shell,awk,sed,Shell,Awk,Sed,我有一个50 GB大小的文本文件如下所示。我想从第1列和第3列中删除chr,跳过以#开头的任何行。我知道我可以这样添加chr,但不知道如何删除它们cat${file}.txt | awk-F“\t”{if($0!~/^#/){print“chr”$0}else{print$0}}>${file}\u moreCHR.txt 文件: ##contig=<ID=HLA-DRB1*> ##reference=file:////Homo_sapiens_assembly38.fasta ##

我有一个50 GB大小的文本
文件
如下所示。我想从第1列和第3列中删除chr,跳过以
#
开头的任何行。我知道我可以这样添加chr,但不知道如何删除它们
cat${file}.txt | awk-F“\t”{if($0!~/^#/){print“chr”$0}else{print$0}}>${file}\u moreCHR.txt

文件:

##contig=<ID=HLA-DRB1*>
##reference=file:////Homo_sapiens_assembly38.fasta
##source=ApplyVQSR
##source=SelectVariants
#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    
chr1    69511   chr1:69511:A:G  A       G       11157600        PASS   
chr1    69536   chr1:69536:C:A  C       A       581.98  PASS    
chr1    69536   chr1:69536:C:T  C       T       581.98  PASS
##contig=
##参考文献=file:////Homo_sapiens_assembly38.fasta
##source=ApplyVQSR
##source=SelectVariants
#色度位置ID参考高度质量过滤器信息
chr1 69511 chr1:69511:A:G A G 11157600通行证
chr1 69536 chr1:69536:C:A C A 581.98通行证
chr1 69536 chr1:69536:C:TCT 581.98通道
我想要的结果是:

##contig=<ID=HLA-DRB1*>
##reference=file:////Homo_sapiens_assembly38.fasta
##source=ApplyVQSR
##source=SelectVariants
#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    
    1    69511   1:69511:A:G  A       G       11157600        PASS   
    1    69536   1:69536:C:A  C       A       581.98  PASS    
    1    69536   1:69536:C:T  C       T       581.98  PASS
##contig=
##参考文献=file:////Homo_sapiens_assembly38.fasta
##source=ApplyVQSR
##source=SelectVariants
#色度位置ID参考高度质量过滤器信息
169511:69511:A:G A G 11157600通行证
169536 1:69536:C:A C A 581.98传球
169536 1:69536:C:TCT 581.98通过

如果要删除“chr”,无论它出现在行的何处,这将删除“chr”字符串,然后不打印以哈希标记开头的行:

sed -e 's/chr//g' ${file}.txt | grep -v '^#' > ${file}_noCHR.txt

如果您的行在其他不想删除的列中有“chr”,则需要稍微修改sed正则表达式。

请尝试以下操作:

awk 'BEGIN {FS = OFS = "\t"}                            # set delimiters to a tab
    !/^#/ {sub("^chr", "", $1); sub("^chr", "", $3)}    # if the line does not start with "#", modify the 1st and 3rd column
    1                                                   # print the line
' ${file}.txt > ${file}_lessCHR.txt
结果:

##contig=<ID=HLA-DRB1*>
##reference=file:////Homo_sapiens_assembly38.fasta
##source=ApplyVQSR
##source=SelectVariants
#CHROM  POS ID  REF ALT QUAL    FILTER  INFO
1   69511   1:69511:A:G A   G   11157600    PASS
1   69536   1:69536:C:A C   A   581.98  PASS
1   69536   1:69536:C:T C   T   581.98  PASS
##contig=
##参考文献=file:////Homo_sapiens_assembly38.fasta
##source=ApplyVQSR
##source=SelectVariants
#色度位置ID参考高度质量过滤器信息
169511:69511:A:G A G 11157600通行证
169536 1:69536:C:A C A 581.98传球
169536 1:69536:C:TCT 581.98通过

在这里添加更通用的解决方案,在variable
cols
中给出所有列的编号,我们不需要多次编写替换,请尝试以下操作

awk -v cols="1,3" '
BEGIN{
  FS=OFS="\t"
  num=split(cols,arr1,",")
  for(i=1;i<=num;i++){
    columns[arr1[i]]
  }
}
!/^#/{
  for(j in columns){
    sub(/^chr/,"",$j)
  }
}
1
' Input_file
awk-v cols=“1,3”
开始{
FS=OFS=“\t”
num=拆分(列,arr1,“,”)
对于(i=1;i这可能适用于您(GNU-sed):

这只会更改以
chr
开头的行

可作为管道的一部分:

cat oldFile | sed -E 's/^chr(\S+\s+\S+\s+)chr/    \1/' > newFile

如何使用cat进行管道传输?我需要使用
cat
打开文件。OP给出的预期输出表明以
开头的行将保留在输出上。@M.NejatAydin您对输出中出现的注释的看法是对的——我假设输出显示不正确。@New\u to\R我不确定您要做什么意思是“用cat打开文件”。如果您希望sed和grep的结果通过管道传输到cat中,那么您可以将“>${file}\u noCHR.txt”替换为“|cat”等。
sed -E 's/^chr(\S+\s+\S+\s+)chr/    \1/' file
cat oldFile | sed -E 's/^chr(\S+\s+\S+\s+)chr/    \1/' > newFile