AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 480561
Accepted
αԋɱҽԃ αмєяιcαη
αԋɱҽԃ αмєяιcαη
Asked: 2018-11-09 05:14:11 +0800 CST2018-11-09 05:14:11 +0800 CST 2018-11-09 05:14:11 +0800 CST

AWK do texto com modificação

  • 772

Tenho o seguinte arquivo:

hello there. let's try&ACCT=1&bla bla bla&EX=1118&anything ss &SERIAL=1011&DEAL=NO
BLA BLA BLA&TOM=1&ACCT=2&LSLSLSLSL&none=1&EX=1218&lord=1&ok=1&SERIAL=201&flag=non

do qual preciso extrair os valores do campo de ACCT=, EX=e SERIAL= para que a saída se torne:

1,11/18,1011
2,12/18,201

onde EXé sempre um número de 4 dígitos onde eu quero inserir a /como o caractere do meio.

awk text-processing
  • 5 5 respostas
  • 112 Views

5 respostas

  • Voted
  1. Best Answer
    Lewis M
    2018-11-09T08:44:29+08:002018-11-09T08:44:29+08:00

    Com base em sua entrada de exemplo, que coloquei em um arquivo chamado test.in, o seguinte comando awk deve fornecer a saída desejada.

    awk -F\& '{for (i=1; i<+NF; i++) {if ($i ~ /^ACCT=/) {acct=$i; sub(/^ACCT=/, "", acct)} if ($i ~ /^EX=/) {ex=$i; sub(/^EX=/, "", ex); sub(/^[0-9][0-9]/, "&/", ex)} if ($i ~ /^SERIAL=/) {serial=$i; sub(/^SERIAL=/, "", serial)}} printf("%s,%s,%s\n", acct, ex, serial)}' test.in
    

    O que isso faz é tratar o & como um separador de campo. Em seguida, ele processa cada campo em uma determinada linha verificando se esse campo começa com ACCT=, EX= ou SERIAL=. Se esse campo for encontrado, esse campo será atribuído à variável apropriada. O subcomando é então usado para remover o início dessa variável. Isso apenas fornece o valor associado a essa chave.

    Como você precisa de uma barra (/) após os 2 primeiros dígitos da tecla EX, esse é o outro sub para EX. O e comercial (&) é uma referência inversa que pega os primeiros 2 dígitos.

    Depois que todos os campos forem processados, ele imprime os valores encontrados nessa linha.

    • 2
  2. Praveen Kumar BS
    2018-11-09T08:32:14+08:002018-11-09T08:32:14+08:00

    Tentei com o método abaixo e funcionou bem como esperado

     k=`awk -F "&" '{print NF}' test.txt | sort | uniq| head -1`
    for ((h=1;h<=$k;h++)); do awk -v h="$h" -F "&" '$h ~ /ACCT/ || $h ~ /EX/ || $h ~ /SERIAL/{print $h}' test.txt; done
    

    resultado

    ACCT=1
    ACCT=2
    EX=1118
    SERIAL=1011
    EX=1218
    SERIAL=201
    
    • 0
  3. αԋɱҽԃ αмєяιcαη
    2018-11-09T11:48:17+08:002018-11-09T11:48:17+08:00

    Usando sed& cateu atingi um estágio de solução :)

    sed 's/.*ACCT=\([0-9]*\).*/\1/' test > 1
    sed 's/.*EX=\([0-9]*\).*/\1/' test > 2
    sed 's/.*SERIAL=\([0-9]*\).*/\1/' test > 3
    

    ENTÃO

    paste 1 2 3
    
    • 0
  4. RudiC
    2018-11-09T13:14:36+08:002018-11-09T13:14:36+08:00

    Tente também esta abordagem passo a passo simples sed:

    sed -r 's/^.*ACCT=//; s/&.*EX=/,/; s/&.*SERIAL=/,/; s/&.*$//; s/,(..)(..),/,\1\/\2,/' file
    1,11/18,1011
    2,12/18,201
    
    • 0
  5. Praveen Kumar BS
    2018-11-10T01:08:44+08:002018-11-10T01:08:44+08:00

    Tentei com os passos abaixo e funcionou bem

     for i in {1..9}; do awk -v i="$i" -F "&" '$i ~ /ACCT/ || $i ~ /SERIAL/{print $i}' p_final.txt; done | awk -F "=" '{print $NF}' >final.txt
    
    for i in {1..9}; do awk -v i="$i" -F "&" '$i ~ /EX/{print $i}' p_final.txt; done| awk -F "=" '{print $NF}'| awk '{print substr($1,1,2)"/"substr($1,3,2)}' >>final.txt
    
    
    cat final.txt  | sed -n '1~2p' | tr "\n" ","| sed 's/,$//g' | sed  "s/.*/&\n/g"  >output.txt
     cat final.txt  | sed -n '2~2p' | tr "\n" ","| sed 's/,$//g' | sed  "s/.*/&\n/g"  >>output.txt
    
    
    [root@praveen_linux_example ~]# cat output.txt
    1,1011,11/18
    2,201,12/18
    [root@praveen_l
    
    • 0

relate perguntas

  • Reorganize as letras e compare duas palavras

  • Subtraindo a mesma coluna entre duas linhas no awk

  • Embaralhamento de arquivo de várias linhas

  • como posso alterar o caso do caractere (de baixo para cima e vice-versa)? ao mesmo tempo [duplicado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve