Estou tentando normalizar um arquivo de dados usando o número de linhas de uma versão anterior do arquivo de dados. Depois de ler essas perguntas , pensei que isso poderia funcionar:
awk -v num=$(wc -l my_first_file.bed) '{print $1, $2, $3, $4/num}' my_other_file.bed
mas gera esse erro:
awk: cmd. line:1: my_first_file.bed
awk: cmd. line:1: ^ syntax error
Proteger the .
com uma barra invertida não muda nada, nem usar crases em vez de $()
.
Como posso usar a saída de wc -l
como uma awk
variável? Tudo isso acontecerá dentro de um pipeline do Snakemake, por isso estou um pouco limitado em termos de flexibilidade.
Conteúdo de my_other_file.bed
:
chrUn_KI270548v1 0 50 0.00000
chrUn_KI270548v1 50 192 1.00000
chrUn_KI270548v1 192 497 0.00000
chrUn_KI270548v1 497 639 1.00000
chrUn_KI270548v1 639 723 0.00000
chrUn_KI270548v1 723 860 1.00000
chrUn_KI270548v1 860 865 2.00000
chrUn_KI270548v1 865 879 1.00000
chrUn_KI270548v1 879 991 2.00000
chrUn_KI270548v1 991 1002 3.00000
chrUn_KI270548v1 1002 1021 2.00000
chrUn_KI270548v1 1021 1093 1.00000
chrUn_KI270548v1 1093 1133 2.00000
chrUn_KI270548v1 1133 1222 1.00000
chrUn_KI270548v1 1222 1235 2.00000
chrUn_KI270548v1 1235 1364 1.00000
chrUn_KI270590v1 0 16 4.00000
chrUn_KI270590v1 16 46 5.00000
chrUn_KI270590v1 46 48 6.00000
chrUn_KI270590v1 48 95 7.00000
chrUn_KI270590v1 95 117 8.00000
chrUn_KI270590v1 117 130 9.00000
chrUn_KI270590v1 130 136 8.00000
chrUn_KI270590v1 136 138 7.00000
chrUn_KI270590v1 138 139 6.00000
wc -l filename
produzirá uma linha contendo duas colunas; o número de linhas e o nome do arquivo:Seu
awk
código fica confuso quando você tenta dividir usando essa string.Se você redirecionar o conteúdo do arquivo para
wc -l
, owc
utilitário não poderá gerar o nome do arquivo e exibirá apenas o número de novas linhas no arquivo:Então, altere seu código para este:
Alternativamente, vamos
awk
fazer a contagem:ou,
Aqui, damos
awk
os dois arquivos para trabalhar, mas ao ler o primeiro arquivo, tudo o que fazemos é incrementar alines
variável. Ao iniciar a leitura do segundo arquivo, aFNR == NR
condição não é mais verdadeira (o número de registros lidos do arquivo atual não é mais igual ao número de registros lidos no geral) e começamos a executar o segundo bloco.Isso pressupõe que o primeiro arquivo nunca esteja vazio.
Se você deseja que a saída seja delimitada por tabulações, não se esqueça de definir
OFS="\t"
forawk
.Tente executar apenas
wc -l my_first_file.bed
:Então, seu comando é expandido pelo shell para
o que torna
my_first_file.bed
o seu comando Awk, o que obviamente não é uma sintaxe válida do Awk.Uma maneira de resolver isso seria alterar seu
wc -l my_first_file.bed
comando para gerar apenas a primeira coluna. Por exemplo, algo assim:Isso usa espaço como delimitador para a saída de cut para apenas passar o número de linhas para sua variável.
Você pode fazer isso completamente
awk
passando dois arquivos como operandos:Isso fará o seguinte:
NR
, o contador de linhas global, sendo igual aFNR
, o contador de linhas por arquivo), simplesmente aumentamos a contagem de linhas, mas pulamos a execução para a próxima linha posteriormente.lines
, que não é mais incrementado porqueNR
agora é maior queFNR
Observe que isso não funcionará se
my_first_file.bed
estiver vazio.