Shell 如何在unix中从中行列值中删除字符串
我有一个50 GB大小的文本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 ##
文件
如下所示。我想从第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通过
在这里添加更通用的解决方案,在variablecols
中给出所有列的编号,我们不需要多次编写替换,请尝试以下操作
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