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

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

Então eu tenho que passar por um log que recebi por e-mail (no Windows), procurar uma linha para determinar o número de série do modelo, imaginei que uma maneira fácil de fazer isso era escrever um script em lote feio para converter o .msg, então eu pode 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

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


Atualizar: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 

Responder1

Há 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 awke passar 3 variáveis ​​para ele. Não é geral porque se você vai ter 4 linhas terá que passar 4 variáveis ​​e assim por diante...

O awkcomando tem a forma simples de gerenciar a coluna através do seu número ( $1, $2... $NFo último).

  • Só para simplificar a leitura aqui, eu uso seu antigo arquivo intermediárioa21s.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 awkcom a opção -v.
    • Nas linhas a seguir você usa que a variável internaNR, mantém a contagem do número da linha. Então você vai imprimir a variávels1, somente quando você tiver a primeira linha, os2com o segundo... e assim por diante.
    • Na última linha após 'você pode especificar o nome do arquivo para não precisar chamar o catprocesso e canalizá-lo para awkaquele.
    • Se a variável (ALPHA,BETA...) for gerada com algum mecanismo (ex. "Serial01, Serial02") você pode colocá-la no lugar dos controles no número da linha e na variável externa.
  • Nota prática:sob *nix você podetrens de comandoscanalizar ( |) uma saída para a seguinte sem a necessidade de criar arquivos intermediários.
    Então, no seu exemplo, você poderia usar diretamente:

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

    Em vez disso, cutneste caso você pode usar o awkcomando cat "*Pre*.msg" | strings2 | grep "D24" | awk '...' > final_file.txt.

Uma solução mais geral: paste+awk

Digamos que você tenha seu a21s.txtarquivo e outro ( b.txt) com o mesmo número de linhas e dentro das strings (uma palavra cada) que deseja prefixar (como 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 do seu serial é a 8 porque você adicionou outra antes com colar.


Observação

peça ao próprio Linux mais informações com man awkeman paste :-)

Responder2

eco ALFA>agrep.txt; gato "Pré.msg" | strings2>>agrep.txt

essa pode não ser a linha exata. O conceito é que vocêprimeirodeseja colocar a palavra "Alpha" no arquivo. Usar um símbolo > cria o arquivo e usar >> anexa ao arquivo. Sem uma "nova linha", deve-se colocar a palavra ALPHA ali e depois anexar a primeira mensagem.

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

EDIT: Pesquisa encontrada usandogatoeimprimirsão opções melhores do que echo, pois o echo pode ser diferente dependendo do sistema operacional

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

E para executar um comando "one liner", o primeiro canal deveria ter sido um ; ou &&

; entre comandos sempre executa o próximo comando && entre comandos executa o próximo comando somente se o anterior for bem-sucedido e || (tubo duplo) executa o próximo comando somente se o anterior falhou

Responder3

Não tenho certeza do que strings2é ou como é sua opinião, não posso ter 100% de certeza de que funcionará conforme o esperado. Mas talvez isso pelo menos indique a direção certa. catpode aceitar entrada de stdin. Então, você também poderia 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

informação relacionada