Como prefixar as 3 primeiras linhas de um arquivo com variáveis diferentes?

1

Então eu tenho que passar por um log eu sou enviado por email (no windows), procure por uma linha para determinar o número de série do modelo, eu percebi que uma maneira fácil de fazer isso era escrever um script em lote feio para converter o log. msg para que eu possa ler o arquivo. exemplo:

cat "*Pre*.msg" | strings2 > agrep.txt
cat agrep.txt | grep "D24" > a21s.txt
cat a21s.txt | cut -d" " -f7 > Air21Serials.txt

que me deixa com 3 números únicos, como adicionaria ALPHA à linha 1, BETA à linha 2 e GAMMA à linha 3 com um espaço ou um: como delimitador?

Atualização: o arquivo a21s.txt é semelhante a

0 1 BXP_0 AIR21B4AB2P KRC118046/1 R3B D240090254 20140416 
0 1 BXP_1 AIR21B4AB2P KRC118046/1 R3B D240088108 20140414 
0 1 BXP_2 AIR21B4AB2P KRC118046/1 R3B D240090208 20140414 
    
por Jon Clegg 24.09.2016 / 08:11

3 respostas

1

Existem muitas maneiras de fazer o que você está procurando, apenas alguns exemplos.

awk e uma solução personalizada

Uma solução adaptada ao seu exemplo é usar awk e passar 3 variáveis para ela. Não é geral porque se você tiver 4 linhas você tem que passar 4 variáveis e assim por diante ...

O comando awk tem a maneira simples de gerenciar a coluna através de seu número ( $1 , $2 ... $NF o último).

  • Para simplificar a leitura aqui, uso seu arquivo intermediário antigo a21s.txt

    awk -v s1="ALPHA" -v s2="BETA" -v s3="GAMMA" '
      NR==1 {print s1,$7} ;  
      NR==2 {print s2,$7} ;  
      NR==3 {print s3,$7} ; '   a21s.txt
    
    • Na primeira linha, você passa 3 variáveis para awk com a opção -v .
    • Nas seguintes linhas você usa que a variável interna NR , mantém a contagem do número da linha. Então você vai imprimir a variável s1 , somente quando você tem a primeira linha, a s2 com a segunda ... e assim por diante.
    • Na última linha após o ' , você pode especificar o nome do arquivo, portanto, não precisa chamar o processo cat e canalizá-lo para o awk one.
    • Se a variável (ALPHA, BETA ...) for generável com algum mecanismo (por exemplo, "Serial01, Serial02"), você poderá colocá-la em vez dos controles no número da linha e na variável externa.
  • Nota prática: em * nix você pode enviar para trens de comandos ( | ) uma saída para o seguinte sem necessidade de criar arquivos intermediários.
    Então, em seu exemplo, você poderia usar diretamente:

    cat "*Pre*.msg" | strings2 | grep "D24" | cut -d" " -f7 > Air21Serials.txt
    

    Em vez de cut , neste caso, você pode usar o comando awk , cat "*Pre*.msg" | strings2 | grep "D24" | awk '...' > final_file.txt .

Uma solução mais geral: paste + awk

Digamos que você tenha seu arquivo a21s.txt e outro ( b.txt ) com o mesmo número de linhas e dentro das cadeias (uma palavra cada) que deseja prefixar (conforme a seguir).

ALPHA
BETA
GAMMA

você pode simplesmente usar

paste b.txt a21.txt | awk '{print $1,$8}' >  Air21Serials.txt

Observe que agora a coluna da sua série é a oitava porque você adiciona outra antes com colar.

Nota

Pergunte ao próprio Linux para obter mais informações com man awk e man paste :-)

    
por 26.09.2016 / 09:45
0

echo ALPHA > agrep.txt; cat " Pre .msg" | strings2 > > agrep.txt

pode não ser a linha exata ... o conceito é que você primeiro deseja colocar a palavra "Alfa" no arquivo. usando um > O símbolo cria o arquivo e usa um > > anexa ao arquivo. Sem uma "nova linha", ele deve colocar a palavra ALPHA e anexar a primeira mensagem.

talvez seja necessário jogar um pouco para que o código funcione exatamente.

EDITAR: A pesquisa encontrada usando cat e printf são opções melhores do que echo, já que o eco pode ser diferente dependendo do sistema operacional

por exemplo: cat ("ALPHA:") > agrep.txt; cat " Pre .msg" | strings2 > > agrep.txt

E para fazer um comando "one liner" o primeiro pipe deveria ter sido a; ou & &

; entre-comandos sempre executa o próximo comando & & entre os comandos executa o próximo comando apenas se o anterior conseguiu e || (double pipe) executa o próximo comando somente se o anterior falhou

    
por 24.09.2016 / 08:38
0

Não tenho certeza do que o strings2 faz ou de como sua entrada é, portanto, não posso ter 100% de certeza de que isso funcionará como esperado. Mas talvez, pelo menos, você aponte na direção certa. cat pode aceitar entrada de stdin. Então, você também pode fazer

echo ALPHA: | cat - "*Pre*.msg" | strings2 > agrep.txt
echo BETA: | cat - agrep.txt | grep "D24" > a21s.txt
echo GAMMA: | cat - a21s.txt | cut -d" " -f7 > Air21Serials.txt
    
por 24.09.2016 / 20:35