Eu gostaria de entender o loop for abaixo e talvez simplificá-lo. Por exemplo, gostaria de concatenar os arquivos rem para cada amostra no diretório.
Arquivos:
file1.1.fq
file1.rem.1.fq
file1.2.fq
file1.rem.2.fq
file2.1.fq
file2.rem.1.fq
file2.2.fq
file2.rem.2.fq
loop for:
list=`for i in *rem*.1.fq; do echo $i | cut -f 1 -d \.; done`
for i in $list; do cat $i.rem.1.fq $i.rem.2.fq > $i.rem.b.fq; done
Posso fazer isso sem fazer uma lista? O que cut -f 1 -d
faz? E por que cat $i.rem.1.fq
funciona, mas não cat $i.1.fq
se a rem
parte do nome do arquivo estiver entre os dois *
da lista? Isso significa que ele captura tudo antes *rem*
(por exemplo, arquivo1)?
Tentar:
Talvez adicione uma verificação para a existência de arquivos:
O método apresentado na pergunta é propenso a erros – se um arquivo contiver um espaço, o segundo
for
loop pode não funcionar corretamente.cut -f 1 -d.
corta uma string em campos (delimitados neste caso por.
) e gera os campos solicitados (neste caso, apenas o primeiro). Se for dada a stringfile 1.whatever
, ela produziráfile 1
. Novamente, isso é propenso a erros, pois o padrão glob*rem*.1.fq
pode retornar nomes de arquivos comanyremthing.1.fq
– o*
curinga corresponde a qualquer coisa (incluindo nada ).Uma opção melhor é fazer um único loop e usar uma expansão de parâmetro, com alguma forma de substituição dentro do loop para corresponder a outros arquivos com nomes relevantes.
*.rem.1.fq
é usado – você pode querer restringir ainda mais – por exemplo.file[0-9].rem.1.fq
.${param%string}
é usado no loop para remover o sufixo.1.fq
. Muitos shells também suportam outras formas de substituições de expansão de parâmetros – por exemplo.${param/string/repl}
.Além disso, geralmente é uma boa ideia citar todos
"$param"
ou"$(command)"
substituições - caso contrário, a maioria dos shells aplicará divisão de campo e geração de nome de arquivo e você pode acabar tentando emcat file 1
vez decat 'file 1'
, por exemplo.Também não se esqueça
--
de marcar o final das opções se você não puder garantir que os nomes dos arquivos não comecem com-
.