Remove a primeira linha de linhas duplicadas na primeira coluna

2

Eu tenho um arquivo csv grande com uma estrutura semelhante a esta:

334050049049426,2018-11-06T20:21:56.591Z,xxx,gdl-qns28-1540279057144
334050049049426,2018-11-06T21:32:47.431Z,xxx,gdl-qns19-1540278993723
334090015032064,2018-11-06T22:22:31.247Z,xxx,gdl-qns15-1540279009813
334090015032064,2018-11-07T01:44:11.442Z,xxx,gdl-qns25-1540279437614
334090015032064,2018-11-07T03:57:18.911Z,xxx,gdl-qns28-1540279710160
334050069888299,2018-11-07T03:32:12.899Z,xxx,gdl-qns29-1540279367769
334050069888299,2018-11-07T03:58:15.475Z,xxx,mgc-qns20-1540281468455

Eu preciso remover a primeira linha encontrada de valores duplicados da primeira coluna. Por exemplo, as linhas 1, 3 e 6 precisam ser removidas.

    
por Ian 02.11.2018 / 05:56

3 respostas

1

tente abaixo de awk se não houver nenhuma linha com a primeira coluna exclusiva.

awk -F, 'pre==$1 { print; next }{ pre=$1 }' infile

Ou abaixo, em vez disso, no caso geral:

awk -F, 'pre==$1 { print; is_uniq=0; next }
                 # print when current& previous lines' 1st column were same
                 # unset the 'is_uniq=0' variable since duplicated lines found

         is_uniq { print temp }
                 # print if previous line ('temp' variable keep a backup of previous line) is a 
                 # uniq line (according to the first column)

                 { pre=$1; temp=$0; is_uniq=1 }
                 # backup first column and whole line into 'pre' & 'temp' variable respectively
                 # and set the 'is_uinq=1' (assuming might that will be a uniq line)

END{ if(is_uniq) print temp }' infile
    # if there was a line that it's uniq and is the last line of input file, then print it

mesmo script com comentários gratuitos:

awk -F, 'pre==$1 { print; is_uniq=0; next }
         is_uniq { print temp }
                 { pre=$1; temp=$0; is_uniq=1 }
END{ if(is_uniq) print temp }' infile

Observação: isso pressupõe que o arquivo de entrada infile esteja classificado no primeiro campo, se não for o caso, será necessário passar o arquivo classificado para

awk ... <(sort -t, -k1,1 infile)
    
por 02.11.2018 / 08:36
0

Assumindo que o csv tenha um formato bem comportado (sem vírgulas ou novas linhas dentro dos campos entre aspas, sem o dobro de " ( "" ), etc) você pode usar isto:

awk -F ',' 'NR==FNR{seen1[$1]++;next};seen1[$1]==1||seen2[$1]++
            {print(NR,$0)}' infile infile

A única maneira de saber se uma linha é repetida em qualquer lugar do arquivo é obter uma contagem de vezes que uma linha é repetida. Isso é feito com seen1 . Então, se a linha tiver uma contagem de 1 (sem repetições) ou se já tiver sido visualizada (esta segunda varredura do arquivo) (feita com seen2 ), imprima-a.

Se o arquivo for classificado pelo primeiro campo, use a solução @devWeek.

    
por 02.11.2018 / 08:25
0
$ cat file
1,a
2,b
2,c
3,d
3,e
3,f
4,g
4,h
5,i

Queremos remover as linhas "2, b", "3, d" e "4, g":

perl -F, -anE '
    push $lines{$F[0]}->@*, $_ 
  } END { 
    for $key (sort keys %lines) {
        shift $lines{$key}->@* if (scalar($lines{$key}->@*) > 1); # remove the first
        print join "", $lines{$key}->@*;
    }
' file
1,a
2,c
3,e
3,f
4,h
5,i
    
por 02.11.2018 / 15:43