Tenho uma pasta com 1000 arquivos; todos os caracteres antes mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
se referem ao ID do indivíduo (por exemplo NA21117,NA21119,NA21126,..)
NA21117.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21119.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21126.mapped.ILLUMINA.bwa.GIH.low_coverage.20121211.bam_dp
NA21127.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21137.mapped.ILLUMINA.bwa.GIH.low_coverage.20120522.bam_dp
NA21142.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21143.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
Cada arquivo tem apenas uma linha:
cat NA21143.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
1 115258827 10
para cada um desses arquivos, quero colar o ID individual no conteúdo do arquivo e obter uma saída como:
1 115258827 10 NA21143
Há alguma forma de fazer isso?
festança simples
para arquivos de várias linhas, ainda pode ser feito com bash simples
notas:
mapfile
comando lê o arquivo em uma matriz de linhas.${var/pattern/string}
expansão do parâmetro faz uma pesquisa e substituição no valor da variável. (documentado no manual )%
o padrão é ancorado no final da string. Aqui, estou combinando o padrão vazio no final da string.Francamente, essa abordagem é muito inteligente e eu optaria por algo mais óbvio.
Use um laço:
Remova .* de $ARGV e acrescente \t $ARGV ao arquivo:
A solução de Glenn provavelmente é mais rápida de executar:
embora se cada arquivo tiver apenas uma única linha, na maioria das vezes estará procurando na unidade.
estranho
Este método é compatível com as versões GNU (Linux) e BSD (Mac) do
awk
.id=FILENAME ; sub(/\..*/,"",id)
Armazene a primeira parte de cada nome de
*.bam_dp
arquivo (tudo antes do primeiro.
) comoid
.print $0 "\t" id
Imprima o conteúdo de cada arquivo, depois um caractere de tabulação e, em seguida, o arquivo
id
.Isso imprimirá uma lista com linhas como no seu exemplo:
Os arquivos originais não serão modificados. Você pode salvar essa saída, por exemplo, adicionando
> file.txt
ao final do comando.