dividindo um arquivo: substitua 'egrep' em 'sed'

0

Eu quero dividir meu $ arquivo contendo x linhas ao meio, e verificar quantas linhas contêm " dead " em um log. Eu comecei com o seguinte:

half='expr $(egrep -c . $file) / 2'

sed -n 1,${half}p $file | 
    xargs echo $file $half $(egrep -c dead $I) > log_1
sed -n ${half},${egrep -c . $file}p | 
    xargs echo $file $half $(egrep -c dead $I) > log_2
A saída

para o primeiro comando sed está ok, mas ao substituir egrep no intervalo de sed , corre mal:

DeadOrAlive 5 2
-bash: ${half},${egrep -c . $file}p: bad substitution

Existe uma maneira mais eficiente de dividir o arquivo em bash ?

    
por ChemMod 10.04.2018 / 21:15

2 respostas

0

  1. Usando wc , head e tail :

    half=$(( $(wc -l "$file")/2 ))
    head -$half | egrep -c dead | xargs echo "$file" $half > log_1
    tail -$half | egrep -c dead | xargs echo "$file" $half > log_2
    
  2. Usando split :

    split -a1 --numeric-suffixes=1 -n 'l/2' "$file" "$file"_
    echo "$file" "$file"_1 $(egrep -c dead "$file_1") > log_1
    echo "$file" "$file"_2 $(egrep -c dead "$file"_2) > log_2
    rm "$file"_[12]
    
por 11.04.2018 / 08:08
0

Aqui está uma solução Awk.

awk '/dead/ { a[++n] = NR }
    END { for (i=1; i<=n; i++) if (a[i] > NR/2) break
        print ARGV, int(NR/2), i-1 >"log_1";
        print ARGV, int(NR/2)+(int(NR/2)!=NR/2), n-i+1 >"log_2" }' file

Coletamos na matriz a os números de linha das correspondências. Descobrimos, então, quantos dos números de linha na matriz são menores que a linha intermediária; sua contagem é atribuída à primeira partição. (Temos que usar i-1 porque já passamos do ponto de particionamento quando break sai do loop.)

Em geral, você quer evitar reler o mesmo arquivo várias vezes, especialmente se for grande; e em segundo lugar, tente minimizar o número de processos.

Não está claro o que você espera que o campo de saída intermediária contenha. Se o arquivo contiver um número ímpar de linhas, a primeira "metade" conterá uma linha menor que a segunda. (Isso não é difícil de mudar, mas você tem que decidir de uma forma ou de outra.)

    
por 11.04.2018 / 08:26