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 / 76981464
Accepted
echo
echo
Asked: 2023-08-26 11:36:39 +0800 CST2023-08-26 11:36:39 +0800 CST 2023-08-26 11:36:39 +0800 CST

Substitua a última metade de cada linha de um arquivo pela última metade da linha correspondente em outro arquivo [fechado]

  • 772
Fechado . Esta questão precisa ser mais focada . No momento não está aceitando respostas.

Quer melhorar esta questão? Atualize a pergunta para que ela se concentre apenas em um problema editando esta postagem .

Fechado há 2 dias .

Melhore esta questão

Tenho dois arquivos A e B. Cada linha em ambos os arquivos é considerada um item. O formato de cada item é fixo, composto por chave e descrição, separados por espaço. conforme mostrado no exemplo abaixo.

UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000027_0000104 /users/documents/ark

A primeira parte, UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000027_0000104, é a chave, e a última parte, /users/documents/ark, é a descrição. Os arquivos A e B possuem 1.000 e 100.000 itens, respectivamente. Cada chave pode ser dividida em duas partes: índice (por exemplo: UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2) e carimbo de data/hora (por exemplo: 0000027_0000104) em nosso exemplo. Não há regra sobre dígitos no carimbo de data/hora. O caractere entre o índice e o carimbo de data/hora é fixado como _. Cada chave é única e cada índice também é único no mesmo arquivo. Cada índice incluído no arquivo A também ocorreu no arquivo B com um carimbo de data/hora diferente. Conforme mostrado em um exemplo simples abaixo.

Arquivo A

UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000000_0000119 /users/documents/ark1
UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000027_0000104 /users/documents/ark2

Arquivo B

UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/documents/ark3
UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/documents/ark4
UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/documents/ark5

Quero substituir a descrição correspondente ao mesmo índice no arquivo B pela descrição correspondente ao índice no arquivo A. O resultado no exemplo é mostrado abaixo.

Arquivo B

UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/documents/ark1
UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/documents/ark2
UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/documents/ark5

Como atingir esta meta?

awk
  • 4 4 respostas
  • 30 Views

4 respostas

  • Voted
  1. potong
    2023-08-26T14:49:58+08:002023-08-26T14:49:58+08:00

    Isso pode funcionar para você (GNU sed):

    sed -E 's|([^_]*_).*( .*)|/^\1/s# .*#\2#|' fileA | sed -f - fileB
    

    Crie um script sed do arquivoA para aplicar ao arquivoB.

    Cada linha no arquivoA é transformada em uma correspondência e uma substituição. O índice é usado como correspondência e sua descrição é usada na substituição e então aplicada ao arquivoB. As linhas correspondentes terão a descrição do arquivoA.

    NB O uso de delimitadores alternativos em ambos os comandos de substituição. Se for provável que a descrição contenha o #caractere, use outro caractere como delimitador que não esteja presente em nenhuma descrição.

    • 3
  2. Kaz
    2023-08-26T12:43:50+08:002023-08-26T12:43:50+08:00

    Solução em TXR Lisp:

    $ txr subst.tl filea fileb
    UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/documents/ark1
    UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/documents/ark2
    UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/documents/ark5
    

    Código:

    (tree-bind (filea fileb) *args*
      (let ((h (hash)))
        (with-stream (s (open-file filea))
          (whilet ((line (get-line s)))
            (match `@a-@{b}_@{c}_@d @path` line
              (set [h `@a-@b-@c`] path))))
        (with-stream (s (open-file fileb))
          (whilet ((line (get-line s)))
            (match `@a-@{b}_@{c}_@d @path` line
              (put-line `@a-@{b}_@{c}_@d @(or [h `@a-@b-@c`] path)`))))))
    

    Ou usando awkmacro para verificar os arquivos; mas caso contrário, a mesma abordagem:

    (awk
      (:let (h (hash)))
      ((= fnr nr)
       (match `@a-@{b}_@{c}_@d @path` rec
         (set [h `@a-@b-@c`] path))
       (next))
      ((match `@a-@{b}_@{c}_@d @path` rec
        (prn `@a-@{b}_@{c}_@d @(or [h `@a-@b-@c`] path)`))))
    
    • 1
  3. Best Answer
    ufopilot
    2023-08-26T15:06:30+08:002023-08-26T15:06:30+08:00
    awk '
        NR==FNR{
            split($1,p,"_")
            a[p[1]"_"p[2]] = $NF
            next
        } 
        split($1,b,"_") && (b[1]"_"b[2] in a){ 
            $NF = a[b[1]"_"b[2]]
        }1
    ' FileA FileB
    
    UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/documents/ark1
    UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/documents/ark2
    UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/documents/ark5
    
    • 1
  4. Ed Morton
    2023-08-26T20:46:37+08:002023-08-26T20:46:37+08:00

    Usando qualquer awk:

    $ cat tst.awk
    { key = substr($1,1,length($1)-16) }
    NR == FNR {
        sub(/[^ ]+/,"")
        map[key] = $0
        next
    }
    key in map {
        $0 = $1 map[key]
    }
    { print }
    

    $ awk -f tst.awk FileA FileB
    UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/documents/ark1
    UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/documents/ark2
    UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/documents/ark5
    

    O procedimento acima funcionará mesmo que alguma de suas "descrições" contenha espaços em branco, por exemplo, dada esta entrada:

    $ head File[AB]
    ==> FileA <==
    UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000000_0000119 /users/saved documents/this    is     interesting ark1
    UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000027_0000104 /users/saved documents/ark2
    
    ==> FileB <==
    UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/saved documents/ark3
    UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/saved documents/and    so     is   this   ark4
    UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/saved documents/and   this   too  ark5
    

    ainda obtemos a saída desejada:

    $ awk -f tst.awk FileA FileB
    UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/saved documents/this    is     interesting ark1
    UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/saved documents/ark2
    UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/saved documents/and   this   too  ark5
    
    • 1

relate perguntas

Sidebar

Stats

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

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +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