Eu tenho o seguinte arquivo:
AA,true
AA,false
BB,false
CC,false
BB,true
DD,true
Estou tentando procurar duplicatas e remover a linha que tem o valor da coluna igual a true
.
como saída, deve ser:
AA,false
BB,false
CC,false
DD,true
text-processing
awk
sed
Hani Gotc
fonte
fonte
true
se for a primeira instância da primeira coluna?AA,true AA,false AA,false AA,false
Qual saída deve ser neste caso? Entendo que essa linha deve ser removida apenas se estiver duplicada e contivertrue
ao mesmo tempo. Todas asfalse
linhas devem permanecer intocadas em qualquer caso. Ou seja, neste caso, apenasAA, true
serão removidos. Mas todas as respostas deixam apenas uma linha -AA,false
. Apenas interessante :)Respostas:
Para expandir o script verticalmente para explicação:
fonte
Versão simples:
"false" classifica em ordem alfabética antes de "true" e o comando Awk aqui apenas mantém a primeira linha apenas para cada valor distinto do primeiro campo.
Se você quiser manter "true" em vez de "false", classifique-o inversamente, passe-o para o mesmo comando do Awk e, novamente, classifique-o novamente depois.
fonte
-u
opção está disponível,sort input.txt | sort -t, -u -k1,1
sort
chamadas? Por que não apenassort -ut, -k1,1 input.txt
?-u
reterá a primeira linha encontrada do arquivo de entrada entre duplicatas ... para um determinado caso, a entrada deve ser classificada antes que-u
possa ser aplicada ... por ex:AA,true
será impressa em vez de,AA,false
pois aparece primeiro na amostra especificada .. mesma razão pela qualawk -F, '!a[$1]++'
por si só não vai resolver este problemaEstruturas de dados:
%h
cujas chaves são os primeiros campos (AAA, BBB, CCC etc.) e os valores correspondentes são números que indicam a ordem em que as chaves foram encontradas. Assim, por exemplo, chave AAA => 0, chave BBB => 1, chave CCC => 2.@h
cujos elementos são linhas contidas na ordem de impressão. Portanto, se true e false forem encontrados nos dados, o valor false entrará na matriz. OTW, se houver um tipo de dados, isso estaria presente.Outra maneira é usar o GNU sed:
FWIW, o código equivalente POSIX para o código GNU-sed acima está listado abaixo:
Explicação
Resultados
fonte
Para cada linha de entrada, armazene o valor do segundo campo na matriz associativa
a
(usando o primeiro campo como chave da matriz) SOMENTE se ainda não tivermos armazenado o valorfalse
dessa chave. Use,
para o separador de campos de entrada e saída. Imprima a matriz depois de ler todas as linhas de entrada.A diferença significativa entre esta e a versão do DopeGhoti é que esta versão não se importa com o valor de
$2
, apenas se importa com o valor, se houvera[$1]
.fonte
sort
Solução de duas passagensPrimeiramente
sort
passe clusters registros por campo1
comfalse
registros anteriorestrue
para cada bloco de registros que compartilham um1
valor de campo comum . A segundasort
passagem é configurada para gerar um registro para cada valor distinto no campo,1
cortesia de-u
. Como-u
implica classificação estável, o único registro assim gerado é o primeiro registro encontrado para cada valor distinto no campo1
- que é um registrofalse
no segundo campo devido ao trabalho realizado pela primeirasort
passagemfonte