Modificação com erro de script

0

Eu apenas escrevo algumas linhas para obter o menor valor em meus arquivos e ele está me dando resultado correto, mas repetindo as linhas duas vezes você pode corrigir o bug

O que estou fazendo:

  • Apertando todos os arquivos
  • Removendo o cabeçalho
  • classificação em notação científica usando a coluna nove
  • pegando a primeira linha que é a menor depois de ordenar e imprimir usando o awk
  • Eu quero o nome do arquivo impresso $ i também

Script:

#!/bin/bash

for i in 'ls -v *.txt' 
do 
smallestPValue='sed 1d $i | sort -k9 -g | head -1 | awk '{print $0}'' 

echo  $i  $smallestPValue >> smallesttPvalueAll.txt
done

saída

U1.text 4 rsxxx 1672175 A ADD 759 0.0751 4.918 1.074e-06
U1.txt 4 rsxxxx 1672175 A ADD 759 0.0751 4.918 1.074e-06
U2.txt  16 rsxxxx 596342 T ADD 734 -0.05458 -5.204 2.535e-07
U2.txt 16 rsxxxx 596342 T ADD 734 -0.05458 -5.204 2.535e-07
U3.txt 2 rsxxxx 12426 T ADD 722 0.06825 5.285 1.669e-07

Estou recebendo repetições por algumas linhas, enquanto algumas estão bem como U3 acima está chegando uma vez e é isso que eu quero. Eu posso facilmente me livrar de linhas duplicadas por uniq ou sort -u mas apenas curioso o que está causando isso

Saída desejada cada linha repetida uma vez

    
por star 28.07.2017 / 16:44

1 resposta

1

Se eu estou interpretando corretamente, você provavelmente pode fazer o que você está tentando fazer com apenas awk e sort - sem necessidade de um loop, ou parsing ls (sugestão sutil: NÃO FAÇA ISSO! ) ou head ou sed .

awk 'FNR > 1 {print FILENAME, $0}' *.txt | sort -k10 -g | sort -u -k1,1

Isso pula a primeira linha de cada arquivo, depois imprime todas as linhas restantes prefixadas com o nome do arquivo e um espaço (separador de registro de saída padrão do awk ou ORS ). Em seguida, ele canaliza a classificação para fazer uma classificação numérica genérica no campo 10. Por fim, ela faz uma classificação exclusiva apenas do primeiro campo ( -k1,1 , o nome do arquivo), de modo que apenas a primeira linha com esse nome seja gerada. / p>

Note que temos que classificar o campo 10 aqui, e não o campo 9 porque adicionamos o nome do arquivo como o primeiro campo para que todos os outros números de campo sejam incrementados em 1.

FNR e FILENAME são variáveis awk integradas. FNR é o número da linha ("input record number" no awk-lingo) do arquivo atual, e FILENAME é o nome do arquivo atual.

aqui está outra maneira de fazer isso, desta vez usando apenas awk :

#!/usr/bin/awk -f

FNR > 1 && (! s[FILENAME] || $9 < s[FILENAME]) {
  s[FILENAME]=$9;
  l[FILENAME]=$0
};

END {
  for (f in s) {
    print f, l[f]
  }
}

salve como, por exemplo smallest-pvalue.awk , torne-o executável com chmod +x smallest-pvalue.awk e execute-o como ./smallest-pvalue.awk *.txt .

Este script awk controla o menor valor visto para o campo 9 de cada arquivo de entrada em uma matriz chamada s e também mantém a linha de entrada correspondente na matriz l .

Depois de processar todos os arquivos, imprime o nome do arquivo e a linha que contém o 9º menor campo para cada arquivo.

    
por 29.07.2017 / 06:49