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 / 695874
Accepted
fuzzydrawrings
fuzzydrawrings
Asked: 2022-03-18 18:12:57 +0800 CST2022-03-18 18:12:57 +0800 CST 2022-03-18 18:12:57 +0800 CST

AWK: Concatenar campo de diferentes registros

  • 772

Dado file:

2018-03-22 foo/bar/baz
2020-09-30 Lorem/ipsum/dolor
2021-10-01 yadda/yadda/yadda
2022-03-14 blah/blah/blah

(os arquivos reais contêm milhares dessas linhas)

Como obter a corda 2018-03-22_2022-03-14? Esta é a concatenação do campo 1 do registro 1, seguido por um sublinhado e, em seguida, o campo 1 do último registro.

Eu cheguei a isso:

$ awk 'BEGIN{ORS="_"}NR==1{print $1} END{print $1}' file | sed 's/_$//'
2018-03-22_2022-03-14

Funciona, mas parece que deve haver uma maneira não complicada de obter o mesmo resultado usando only awk, ou talvez apenas sed, sem pipes ou subshells. Existe de fato tal maneira?

awk text-processing
  • 7 7 respostas
  • 196 Views

7 respostas

  • Voted
  1. Philippos
    2022-03-19T04:17:09+08:002022-03-19T04:17:09+08:00

    A sedversão -somente:

    sed 's/ .*//;1h;$!d;H;g;y/\n/_/' file
    
    • Use s/ .*//para remover tudo após o espaço em branco, mantendo apenas a data
    • 1hcopia a data da linha 1no holdespaço
    • $!d dexclui todas as linhas exceto a última
    • se chegarmos aqui, estamos na última linha, então anexamos essa linha ao Hespaço antigo com nossa primeira data e copiamos ambas no espaço padrão comg
    • Agora, a única coisa que resta a fazer é substituir a nova linha incorporada (causa anexando) pelo sublinhado:y/\n/_/

    (E sim, é um pouco mais curto)

    • 2
  2. Ed Morton
    2022-03-19T15:26:15+08:002022-03-19T15:26:15+08:00

    Para portabilidade, não faça print $1(ou use $anything) na ENDseção, pois o valor de $0, $1, etc. na ENDseção é um comportamento indefinido por POSIX. Em alguns awks $1da ENDseção será o valor do primeiro campo da última linha lida, em outros awks será null, e em outros awks ainda pode ser qualquer outra coisa.

    Usando qualquer awk em qualquer shell em cada caixa Unix:

    $ awk -v OFS='_' 'NR==1{beg=$1} {end=$1} END{print beg, end}' file
    2018-03-22_2022-03-14
    

    ou para evitar imprimir um único _se o arquivo de entrada estiver vazio:

    awk -v OFS='_' 'NR==1{beg=$1} {end=$1} END{ if (NR) print beg, end}' file
    

    O acima pressupõe que, se houver apenas 1 linha na entrada, você deseja o mesmo $1valor duplicado com um _entre eles. Se não for isso que você deseja, atualize sua pergunta para esclarecer seus requisitos para esse caso.

    • 2
  3. fuzzydrawrings
    2022-03-18T18:12:57+08:002022-03-18T18:12:57+08:00

    Uma maneira que é totalmente awk(embora não estritamente compatível com POSIX como @EdMorton aponta devido à referência de campo na ENDseção) é definir uma variável para o valor do campo 1 do registro 1 e, no final, imprimir essa variável com _e campo 1 do último registro:

    $ awk 'FNR==1{d=$1} END{print d"_"$1}' file
    2018-03-22_2022-03-14
    

    nota: eu não tinha planejado que isso fosse uma pergunta do tipo "Q&A", mas o SE estava no modo somente leitura quando tentei enviar o Q , e nesse meio tempo finalmente descobri um A . Ainda gostaria de ver outras respostas, especialmente se forem mais curtas na linha de comando.

    • 1
  4. Best Answer
    user516667
    2022-03-19T04:25:09+08:002022-03-19T04:25:09+08:00

    Use printfpara controlar a saída:

    $ awk 'NR==1{printf("%s_", $1)}END{print $1}' f
    2018-03-22_2022-03-14
    
    • 1
  5. Weihang Jian
    2022-04-01T08:35:47+08:002022-04-01T08:35:47+08:00

    Eu sugiro que você use heade tailpara arquivos de entrada grandes porque awke sedsão lentos para processar arquivos grandes.

    $ cat input.txt
    2018-03-22 foo/bar/baz
    2020-09-30 Lorem/ipsum/dolor
    2021-10-01 yadda/yadda/yadda
    2022-03-14 blah/blah/blah
    
    { head -n1 input.txt && tail -n1 input.txt; } |
      cut -d ' ' -f1 | paste -sd _ -
    
    2018-03-22_2022-03-14
    
    • 1
  6. G-Man Says 'Reinstate Monica'
    2022-03-18T19:38:52+08:002022-03-18T19:38:52+08:00

    Isso é mais longo que o seu comando, mas tem o potencial de ser mais rápido se o arquivo for grande:

    echo "$(head -1 file | cut -d' ' -f1)_$(tail -1 file | cut -d' ' -f1)"
    

    Se o arquivo for realmente delimitado por tabulação, você pode deixar de fora a extensão -d' '. Se o arquivo pode começar com -, ou os $1valores podem conter barras invertidas,

    printf '%s_%s\n' "$(head -1 file | cut -d' ' -f1)" "$(tail -1 file | cut -d' ' -f1)"
    

    pode ser mais seguro.

    • 0
  7. Praveen Kumar BS
    2022-03-18T20:36:31+08:002022-03-18T20:36:31+08:00
    #!/usr/bin/python
    fil=open('file','r')
    fillist=fil.readlines()
    filine=fillist[0].strip().split(' ')[0]
    lasline=fillist[-1].strip().split(' ')[0]
    print filine+"_"+lasline
    

    resultado

    2018-03-22_2022-03-14
    
    • 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

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

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

    • 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

    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
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • 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
    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

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