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 / 77024031
Accepted
Candy
Candy
Asked: 2023-09-01 22:39:22 +0800 CST2023-09-01 22:39:22 +0800 CST 2023-09-01 22:39:22 +0800 CST

Comando Awk para obter linhas exclusivas em um arquivo com múltiplas colunas

  • 772

Estou tentando obter linhas exclusivas em um arquivo com várias colunas.

Meu arquivo "file.txt" contém o registro de exemplo abaixo

20230830,52678,004,Apple,21
20230830,52678,004,Apple,20
20230830,52678,004,Apple,19
20230831,47689,001,Orange,15
20230901,47620,002,Grape,29

Minha saída desejada é imprimir apenas linhas únicas da coluna 1 a 4. Independentemente do valor na coluna 5

20230831,47689,001,Orange,15
20230901,47620,002,Grape,29

Tentei usar sed para adicionar um separador exclusivo entre as colunas 1-4 e a coluna 5

E então eu uso o comando awk para obter linhas exclusivas da coluna 1-4

sed 's/,/|/4' file.txt | awk -F"|" '{arr[$1]++} END{for(i in arr) if(arr[i]==1) print $0}'

Com esse código ele funciona com um pequeno conjunto de dados mas quando uso em um arquivo com 1000 linhas, obtenho...

20230831,47689,001,Orange,15
20230831,47689,001,Orange,15
20230831,47689,001,Orange,15
20230831,47689,001,Orange,15
...

valores únicos continuam chegando. Eles estão duplicando. Parece que estou recebendo apenas uma linha única e ela continua duplicando.

Você pode me ajudar se houver algo errado com meu código?

Espero imprimir apenas linhas exclusivas como esta

20230831,47689,001,Orange,15
20230901,47620,002,Grape,29
awk
  • 3 3 respostas
  • 47 Views

3 respostas

  • Voted
  1. Best Answer
    markp-fuso
    2023-09-01T22:57:01+08:002023-09-01T22:57:01+08:00

    Não há necessidade de usar sedpara converter o delimitador de campo de ,para |, pois awké capaz de analisar o arquivo em ,.

    Uma awkideia:

    awk  '
    BEGIN { FS=OFS="," }
          { key = $1 OFS $2 OFS $3 OFS $4
            lines[key]=$5
            counts[key]++
          }
    END   { for (i in counts) 
                if (counts[i]==1)                # unique if count == 1
                   print i,lines[i]
          }
    ' file.txt
    

    Isso gera:

    20230901,47620,002,Grape,29
    20230831,47689,001,Orange,15
    

    NOTA: a ordem em que os índices do array são processados ​​não é garantida; se a saída precisar ser classificada em uma ordem específica, poderíamos adicionar mais código


    re: Comentário do OP: I just need to make it in one line.Algumas opções vêm à mente:

    Coloque o código atual em uma linha, por exemplo:

    awk 'BEGIN {FS=OFS=","} {key = $1 OFS $2 OFS $3 OFS $4;lines[key]=$5;counts[key]++} END {for (i in counts) if (counts[i]==1) print i,lines[i]}' file.txt
    

    Coloque o awkcódigo em um arquivo separado (por exemplo, key.awk) e faça referência ao arquivo na awkinvocação, por exemplo:

    $ cat key.awk
    BEGIN { FS=OFS="," }
          { key = $1 OFS $2 OFS $3 OFS $4
            lines[key]=$5
            counts[key]++
          }
    END   { for (i in counts) 
                if (counts[i]==1)
                   print i,lines[i]
          }
    
    $ awk -f key.awk file.txt
    20230901,47620,002,Grape,29
    20230831,47689,001,Orange,15
    
    • 2
  2. Kent
    2023-09-01T22:55:52+08:002023-09-01T22:55:52+08:00

    Awk pode resolver seu problema sozinho:

    kent$ awk -F, '{k=$1 FS $2 FS $3 FS $4; a[k]++; b[k]=$0}
                   END{for(x in a) if(a[x]==1)print b[x]}' file
    20230901,47620,002,Grape,29
    20230831,47689,001,Orange,15
    
    • 1
  3. dawg
    2023-09-01T23:55:20+08:002023-09-01T23:55:20+08:00

    Este canal Unix identificará linhas em seu arquivo que são duplicadas com base nos primeiros 4 campos:

    $ cut -d, -f 1-4 file | uniq -d
    20230830,52678,004,Apple
    

    Você pode então usar greppara inverter essa correspondência para que as duplicatas sejam ignoradas:

    $ grep -vF -f <(cut -d, -f 1-4 file | uniq -d) file  
    

    Impressões:

    20230831,47689,001,Orange,15
    20230901,47620,002,Grape,29
    

    A vantagem aqui é o menor requisito de memória, já que você não precisa manter o arquivo inteiro na memória.

    • 1

relate perguntas

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

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