Reordenando strings no linux

0

Como posso alterar as linhas usando a linha de comando?
por exemplo. Eu tenho estas linhas:

    Acct-Status-Type = Start
    User-Name = "37XXXXXXX"
    Event-Timestamp = "Apr 12 2013 15:56:55 AMT"

Eu preciso mudar a ordem para isso:

    Event-Timestamp = "Apr 12 2013 15:56:55 AMT"
    User-Name = "37XXXXXXX"
    Acct-Status-Type = Start

Eu preciso fazer isso por um comando, sed, awk, perl ou algo parecido.

    
por user37033 13.04.2013 / 08:28

2 respostas

2

Depende de onde, com que frequência, por que etc. você faz isso, mas não faria mal colocá-lo em um script.

De qualquer forma, você poderia fazer algo assim para imprimir em ordem definida. Por este abordagem você também pode optar por imprimir apenas alguns selecionados. Por exemplo. apenas 1 e 3:

Um forro:

awk -v order=312 \
'/^/{ln[NR]=$0}END{split(order,a,"");
 for(i in a)printf("%s\n",ln[a[i]]);}' \
 sample.txt

Ou mais fácil de ler:

/^/{
    ln[NR] = $0
}
END{
    split(order,a,"");

    for(i in a)
        printf("%s\n",ln[a[i]]);
}

Para a divisão, você poderia adicionar um delimitador a mais de 9 linhas.

Por exemplo:

split(order,a,"-");
# and call by:
awk -v order=3-13-21-12-2 ...

Ou para oferecer suporte a vários:

if (order ~ /-/)       split(order, a, "-"); # order has "-", split
else if (order ~ /\./) split(order, a, "."); # order has ".", split
else if (order ~/:/)   split(order, a, ":"); # order has ":", split
else                   split(order, a, "");  # none presume numbers split all

Você também pode escolher combinar linhas como em:

BEGIN {
    i = 0;
}
/^\s*Acct-Status-Type/ {ln[++i] = $0 }
/^\s*User-Name/ {ln[++i] = $0 }
/^\s*Event-Timestamp/ {ln[++i] = $0 }
END {
    if (order ~ /-/)  split(order, a, "-");
    else if (order ~ /\./) split(order, a, ".");
    else if (order ~/:/) split(order, a, ":");
    else split(order, a, "")
    for (i in a)
        printf("%s\n", ln[a[i]]);
}

Editar:

Para a última amostra, isso provavelmente seria melhor. (Também atualizado o split ):

/^\s*Acct-Status-Type/ {ln[1] = $0 }
/^\s*User-Name/ {ln[2] = $0 }
/^\s*Event-Timestamp/ {ln[3] = $0 }
END {
    if (split(order, a, "-|:|,| |\.") == 1) # Space require quoting of arg.
        split(order, a, "")
    for (i in a)
        printf("%s\n", ln[a[i]]);
}
    
por 13.04.2013 / 09:54
1

Com o Python e o nome do arquivo como o parâmetro da linha de comando para o programa:

import sys
with open(sys.argv[1]) as fp:
    for line in fp.readlines()[::-1]:
        sys.stdout.write(line)

ou gravá-lo no arquivo:

import sys
with open(sys.argv[1]) as fp:
    lines = fp.readlines()
with open(sys.argv[1], 'w') as fp:
    for line in lines[::-1]:
        fp.write(line)

ou como um filtro de stdin para stdout:

lines = sys.stdin.readlines()
for line in lines[::-1]:
    sys.stdout.write(line)
    
por 13.04.2013 / 12:08

Tags