Скрипт AWK для серии дубликатов - PullRequest
0 голосов
/ 24 октября 2019

Надеюсь, кто-нибудь может помочь мне с этим.

Исходный пример данных в File1:

0011,ABC,134,E,E
0034,GGG,234,I,E
0011,ABC,135,I,E
8721,KOO,832,E,E
0011,ABC,136,E,E
0122,DEF,412,E,E
0076,HDD,234,E,E
0122,DEF,422,E,E
0099,CCC,633,I,E
0873,JJJ,352,I,E
0099,CCC,693,E,E
0100,FER,533,E,E
9213,TRE,002,E,E
9213,DWJ,024,O,E
0100,FER,543,O,E
1256,CCC,902,C,E
0100,FER,583,P,E
0323,SWE,745,I,E

Итак, я отсортировал и отфильтровал мои CSV-файлы с дублирующимися записями (уже удалены отдельные записи):

sort file1|awk 'BEGIN { FS="," } { c[$1]++; l[$1,c[$1]]=$0 } END { for (i in c) { if (c[i] > 1) for (j = 1; j <= c[i]; j++) print l[i,j] } }' file1 > file2

Вывод файла 2:

0100,FER,533,E,E
0100,FER,543,O,E
0100,FER,583,P,E
0099,CCC,633,I,E
0099,CCC,693,E,E
0122,DEF,412,E,E
0122,DEF,422,E,E
9213,TRE,002,E,E
9213,DWJ,024,O,E
0011,ABC,134,E,E
0011,ABC,135,I,E
0011,ABC,136,E,E

Я только пытаюсь получить дубликаты наборов, где COL4 = I, и в этом случае все дубликаты сохраняются в одном наборе на основеCOL1 в противном случае удалить серию.

Желаемый вывод:

0011,ABC,134,E,E
0011,ABC,136,E,E
0011,ABC,135,I,E
0099,CCC,693,E,E
0099,CCC,633,I,E

Ответы [ 3 ]

0 голосов
/ 24 октября 2019

В конце концов понял, что вы имеете в виду, чего вы можете достичь, просто добавив другую переменную сигнала, попробуйте следующее:

awk -F, '$4=="I"{p[$1]} {c[$1]++; l[$1,c[$1]]=$0} END{ for (i in c) { if (c[i] > 1 && i in p) for (j = 1; j <= c[i]; j++) print l[i,j] }}' file1 > file2

Если вы хотите сначала отсортировать, то это:

sort file1 | awk -F, '$4=="I"{p[$1]} {c[$1]++; l[$1,c[$1]]=$0} END{ for (i in c) { if (c[i] > 1 && i in p) for (j = 1; j <= c[i]; j++) print l[i,j] }}' > file2

При вводе сэмпла он выводит так:

$  awk -F, '$4=="I"{p[$1]} {c[$1]++; l[$1,c[$1]]=$0} END{ for (i in c) { if (c[i] > 1 && i in p) for (j = 1; j <= c[i]; j++) print l[i,j] }}' file1
0099,CCC,633,I,E
0099,CCC,693,E,E
0011,ABC,134,E,E
0011,ABC,135,I,E
0011,ABC,136,E,E

## OR ##

$ sort file1 | awk -F, '$4=="I"{p[$1]} {c[$1]++; l[$1,c[$1]]=$0} END{ for (i in c) { if (c[i] > 1 && i in p) for (j = 1; j <= c[i]; j++) print l[i,j] }}'
0099,CCC,633,I,E
0099,CCC,693,E,E
0011,ABC,134,E,E
0011,ABC,135,I,E
0011,ABC,136,E,E
0 голосов
/ 24 октября 2019
$ cat tst.awk
NR==1 { print; next }
$1 != prev { prt() }
{
    recs[$1] = recs[$1] $0 ORS
    tgtCol[$4]
    prev = $1
}
END { prt() }
function prt() {
    if ( "I" in tgtCol ) {
        printf "%s", recs[prev]
    }
    delete tgtCol
    delete recs
}

$ awk -f tst.awk file
COL1  COL2 COL3 COL4 COL5
0011  ABC  134  E    E
0011  ABC  135  I    E
0011  ABC  136  E    E
0099  CCC  633  I    E
0099  CCC  693  E    E
0 голосов
/ 24 октября 2019

РЕДАКТИРОВАТЬ: Поскольку OP изменила Input_file, добавив следующее решение следующим образом.

awk '
BEGIN{
  FS=","
}
{
  if($4=="I"){
    a[$2]
  }
  c[$2]++
  b[$2,c[$2]]=$0
}
END{
  for(i in c){
    if(c[i] > 1){
      for(j = 1; j <= c[i]; j++){
        if(i in a){
          print b[i,j]
        }
      }
    }
  }
}
'  Input_file


Поскольку вы не показали образецвходных данных, поэтому они не проверяются, также это попытка OP, которую я здесь исправляю, как только будут даны образцы, мы могли бы искать и другие решения.

awk '
BEGIN{
  FS=","
}
{
  if($4=="I"){
    a[$1]
  }
  c[$1]++
  b[$1,c[$1]]=$0
}
END{
  for(i in c){
    if(c[i] > 1){
      for(j = 1; j <= c[i]; j++){
        if(a[i]){
          print b[i,j]
        }
      }
    }
  }
}
' file1 > file2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...