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 / coding / Perguntas / 79583939
Accepted
kuninox
kuninox
Asked: 2025-04-21 10:04:30 +0800 CST2025-04-21 10:04:30 +0800 CST 2025-04-21 10:04:30 +0800 CST

Reformatar números, inserindo separadores em posições fixas

  • 772

Há muitas linhas em um arquivo, como as seguintes:

000100667 ===> 000102833
005843000 ===> 005844000
011248375 ===> 011251958

Gostaria de inserir separadores específicos nos números como este:

00:01:00,667 ===> 00:01:02,833
00:58:43,000 ===> 00:58:44,000
01:12:48,375 ===> 01:12:51,958

No momento estou tentando (sucesso apenas na primeira parte):

echo 000100667 | gawk '{printf "%s:%s:%s,%s\n", $1, $2, $3, $4}' FIELDWIDTHS="2 2 2 3"

unix
  • 6 6 respostas
  • 1195 Views

6 respostas

  • Voted
  1. Best Answer
    RavinderSingh13
    2025-04-21T10:28:21+08:002025-04-21T10:28:21+08:00

    Com os exemplos apresentados, tente o seguinte awkcódigo. Escrito e testado com GNU awk.

    awk -v OFS=":" '
    match($0,/^(.{2})(.{2})(.{2})(.{3})( ===> )(.{2})(.{2})(.{2})(.{3})$/,arr){
      print arr[1],arr[2],arr[3]","arr[4] arr[5] arr[6],arr[7],arr[8]","arr[9]
    }
    ' Input_file
    

    Com FIELDWIDTHSsolução: Escrito e testado com amostras mostradas.

    awk -v FIELDWIDTHS="2 2 2 3 6 2 2 2 3" -v OFS=":" '{print $1,$2,$3","$4 $5 $6,$7,$8","$9}' Input_file
    
    • 12
  2. Cyrus
    2025-04-21T16:09:36+08:002025-04-21T16:09:36+08:00

    Com GNU sed:

    sed -E 's/([0-9].)(..)(..)(...)/\1:\2:\3,\4/g' file
    

    Ele separa qualquer sequência de nove caracteres que começa com um dígito como este (dígitos são posições dentro do padrão): 123456789torna-se 12:34:56,789.

    Se for muito genérico, o .("qualquer caractere") deve ser substituído por [0-9] ("dígito").

    Saída:

    00:01:00.667 ===> 00:01:02.833
    00:58:43.000 ===> 00:58:44.000
    01:12:48.375 ===> 01:12:51.958
    
    • 7
  3. Jetchisel
    2025-04-21T11:11:50+08:002025-04-21T11:11:50+08:00

    Usando sed com o -Esinalizador:

    sed -E '/^[[:digit:]]{9}/s/([[:digit:]]{2})([[:digit:]]{2})([[:digit:]]{2})([[:digit:]]{3})/\1:\2:\3,\4/g' file.txt
    

    Para corresponder exatamente às strings em uma linha.

    sed -E '/^[[:digit:]]{9} ===> [[:digit:]]{9}$/s/([[:digit:]]{2})([[:digit:]]{2})([[:digit:]]{2})([[:digit:]]{3})/\1:\2:\3,\4/g' file.txt
    

    • O -Esinalizador/opção que é ERE agora é padrão para sed de acordo com POSIX

    • O comportamento pode variar dependendo das configurações locais , que afetam como as classes de caracteres [[:digit:]]são [a-z]interpretadas.

    • 6
  4. potong
    2025-04-21T13:14:58+08:002025-04-21T13:14:58+08:00

    Isso pode funcionar para você (GNU sed):

    sed -E 's/(..)(..)(..)(... ===> ..)(..)(..)/\1:\2:\3,\4:\5:\6,/' file
    

    Use correspondência de padrões e substituição com referências posteriores.

    Para uma belt and bracesabordagem:

    sed -E '/^[[:digit:]]{9} ===> [[:digit:]]{9}$/s/(..)(..)(..)(... ===> ..)(..)(..)/\1:\2:\3,\4:\5:\6,/' file
    

    Ou:

    sed -E '/^[0-9]{9} ===> [0-9]{9}$/s/\b(..)\B(..)\B(..)\B/\1:\2:\3,/g' file
    
    • 6
  5. Ed Morton
    2025-04-21T18:58:46+08:002025-04-21T18:58:46+08:00

    Usando um awk que suporte gensub()GNU awkou mawk2:

    $ awk '
        { print f($1), $2, f($3) }
        function f(s) { return gensub(/(..)(..)(..)(.*)/, "\\1:\\2:\\3,\\4", 1, s) }
    ' file
    00:01:00,667 ===> 00:01:02,833
    00:58:43,000 ===> 00:58:44,000
    01:12:48,375 ===> 01:12:51,958
    

    ou usando qualquer awk:

    $ awk '
        { print f($1), $2, f($3) }
        function f(s) { return substr(s,1,2) ":" substr(s,3,2) ":" substr(s,5,2) "," substr(s,7) }
    ' file
    00:01:00,667 ===> 00:01:02,833
    00:58:43,000 ===> 00:58:44,000
    01:12:48,375 ===> 01:12:51,958
    
    • 5
  6. Daweo
    2025-04-21T18:56:34+08:002025-04-21T18:56:34+08:00

    Eu melhoraria sua solução da seguinte maneira, deixe file.txto conteúdo ser

    000100667 ===> 000102833
    005843000 ===> 005844000
    011248375 ===> 011251958
    

    então

    awk 'BEGIN{FIELDWIDTHS="2 2 2 3";RS=" ===> |\n"}{printf "%s:%s:%s,%s%s", $1, $2, $3, $4, RT}' file.txt
    

    dá saída

    00:01:00,667 ===> 00:01:02,833
    00:58:43,000 ===> 00:58:44,000
    01:12:48,375 ===> 01:12:51,958
    

    Explicação: Usei FIELDWIDTHS literalmente, mas informei ao GNU Awk que a linha pode ser separada por ===> (incluindo espaços) OU ( |) quebra de linha. Alterei printfpara que o último caractere seja o terminador de linha ( RT), então ===> para valores à esquerda de ===> e quebra de linha para todos os outros.

    (testado no GNU Awk 5.3.1)

    • 2

relate perguntas

  • Linux sed com < e >

  • Para encontrar contagem de palavras arquivo por arquivo

  • carregando variável env do arquivo no makefile

  • divida em linhas e pegue um padrão em um arquivo

  • PDL em início

Sidebar

Stats

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

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

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