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.