2016-05-25 16 views
0

Ich habe ein Problem mit der Formatierung der Ausgabe unten.Awk Problem, doppelte Zeilen in mehreren Dateien gleichzeitig.

Ich habe doppelte Zeilen in vielen Dateien SHORT_LIST.a SHORT_LIST.b SHORT_LIST.c, aber es kann viele, viele mehr geben.

Die Zeile "test1" existiert in allen drei Dateien, ebenso die Zeichenfolge "sample".

Die Zeile "Test" existiert in zwei Dateien, aber existiert mehr als einmal in einer der Dateien, ich möchte es nur einmal pro Dateiname ausgeben lassen.

function check_duplicates { 

awk 'END { 
    for (R in rec) { 
    #split out the SHORT_LIST files 
    n = split(rec[R], t, "/SHORT_LIST") 
    #printf n dup[n] 
    count = 0 
if (n > 2) 
dup[n] = dup[n] ? dup[n] RS sprintf(R, rec[R]) : 
    sprintf("\t%-20s %s ", R, rec[R]); 
} 
for (D in dup) { 
    ((count++)) 
    printf "%s\n \n", d 
    printf count "). Duplicate record(s) found in the following files: " dup[D] 
    } 
    } 
{ 
    # build an array named rec (short for record), indexed by 
    # the content of the current record ($0), concatenating 
    # the filenames separated by/as values 
    rec[$0] = rec[$0] ? rec[$0] "\n \t" FILENAME : FILENAME 
    }' $SITEFILES 

    } 

check_duplicates 

Stromausgang unter:

Duplizieren in den folgenden Dateien Datensätze:

1). Doppelte Eintragung (en) in den folgenden Dateien: test1
SHORT_LIST.a SHORT_LIST.b SHORT_LIST.c Probe

2). Duplizieren Datensatz (s) gefunden in den folgenden Dateien: Test
SHORT_LIST.c SHORT_LIST.b SHORT_LIST.b SHORT_LIST.b

3). Doppelte Eintragung (en) in den folgenden Dateien:/path/to/file
SHORT_LIST.a SHORT_LIST.c testa

gewünschte Ausgabe unter:

doppelte Datensätze in den folgenden Dateien:

1). Doppelte Eintragung (en) in den folgenden Dateien: test1
SHORT_LIST.a SHORT_LIST.b SHORT_LIST.c

2). Doppelte Eintragung (en) in den folgenden Dateien: Probe
SHORT_LIST.a SHORT_LIST.b SHORT_LIST.c

3). Duplizieren Datensatz (s) gefunden in den folgenden Dateien: Test
SHORT_LIST.c SHORT_LIST.b

4). Doppelte Eintragung (en) in den folgenden Dateien:/path/to/file
SHORT_LIST.a SHORT_LIST.c

5). Doppelte Eintragung (en) in den folgenden Dateien: testa SHORT_LIST.a SHORT_LIST.c

Irgendwelche Vorschläge wäre sehr dankbar, ich habe Probleme mit diesem Grad an AWK.

+0

Ich bin mir nicht sicher, wie das helfen würde? Ich muss das Duplikat und jede Datei auflisten. –

+1

Ich nehme meinen ursprünglichen Kommentar zur Kenntnis. Vielleicht etwas wie 'sort -o file.srt file; sort file2.srt file2; comm -12 Datei.srt Datei2.srt> Datei1_2.comm; awk '{print "Dupes:" $ 0}' file1_2.comm' würde es erlauben, Standard-Tools zu verwenden, anstatt "das Rad neu zu erfinden" ;-). Sie müssen sich die Zeit nehmen, über 'comm' zu lesen, um festzustellen, ob Sie die Ausgabe für Sie arbeiten lassen können. Viel Glück. – shellter

+0

Die Sache ist, ich übergebe in vorgegebenen Dateien über $ SITEFILES, sie werden zu Beginn in ein größeres Skript übergeben und können nach Namen, Datum, Größe usw. angeordnet werden, so dass ich nicht einfach eine Datei geben kann Namen, weil ich manchmal eine Datei habe, in anderen könnte ich 5000 haben, es hängt davon ab, was die frühere Verarbeitung durchmacht. –

Antwort

0

ich spaltete es durch mehrere Dateien aus, und in derselben Datei, habe ich auch in Sachen setzen, damit für Kommentare ignoriert werden, auch Sie diese mit weißen Raum tun könnte, usw.

Vielen Dank @Karakfa Ihre Antwort war erstaunlich, danke.

function check_duplicates { 
#Check multiple files for duplicates. 
    awk ' 
    FNR==1{files[FILENAME]} 
      {if((FILENAME, $0) in a) dupsInFile[FILENAME] 
      else 
      {a[FILENAME, $0] 
       dups[$0] = $0 in dups ? (dups[$0] RS FILENAME) : FILENAME 
       count[$0]++}} 
       #ignore comment lines 
       {if ($0 ~ /#/) { 
        delete dups[$0] 
       }} 
    #Print duplicates in more than one file 
      END{for(k in dups) 
      {if(count[k] > 1) 
       {print ("\n\n\tDuplicate line found: " k) "\n\tIn the following file(s)" 
       print dups[k] }} 
      printf "\n"; 


     }' $SITEFILES 
#Check single files for duplicates.  
awk ' 
NR { 
    b[$0]++ 
    } 
    #ignore comment lines 
     $0 in b { 
      if ($0 ~ /#/) { 
      delete b[$0] 
         } 
         if (b[$0]>1) { 
         print ("\n\n\tDuplicate line found: "$0) "\n\tIn the following file" 
         print FILENAME 
         delete b[$0] 
         } 
    }' $SITEFILES 


    } 
2
You can follow this template and fix the output format as desired 

$ awk -f dups.awk fa fb fc 

dups for : /path/to/file in files 
fa fc 
dups for : test in files 
fa fb fc 
dups for : sample in files 
fa fb fc 
no dups in 
fc 

$ cat dups.awk 

    FNR==1{files[FILENAME]} 
     {if((FILENAME, $0) in a) dupsInFile[FILENAME] 
     else 
      {a[FILENAME, $0] 
      dups[$0] = $0 in dups ? (dups[$0] FS FILENAME) : FILENAME 
      count[$0]++}} 
    END{for(k in dups) 
      {if(count[k] > 1) 
       {print ("dups for : " k) " in files" 
       print dups[k]}} 
     for(f in dupsInFile) delete files[f]; 
     print "no dups in"; 
     for(f in files) printf "%s", f FS; 
     printf "\n"; 
    } 

wo

$ head f{a,b,c} 
==> fa <== 
test 
test 
test1 
sample 
/path/to/file 

==> fb <== 
test 
test 
sample 

==> fc <== 
test 
sample 
/path/to/file 

ps. Geben Sie immer eine Beispieleingabe ein.

+0

Woah danke, das ist perfekt! - Em, irgendeine Idee, wie ich Dupes in der gleichen Datei finden kann? oder wie könnte ich eine neue Zeile zwischen den Dateinamen hinzufügen? d. h. "fa" \ n "fb" \ n "fc" –

+0

d. h. fb testet zweimal dort, für jede Zeile in diesen Dateien wird ein Job gestartet, also ist es wichtig, auch Duplikate in jeder Datei zu finden. wenn das irgendeinen Sinn ergibt? –

+1

Mein Verständnis von Ihrem "The Line" -Test existiert ... nur einmal pro Dateiname ausgegeben. Anweisung ist, dass Duplikate in einer Datei nicht gemeldet werden sollen. – karakfa

1

Vielleicht so etwas wie

awk '{print FILENAME "\t" $0}' $SITEFILES \ 
| sort \ 
| uniq -c -f1 \ 
| awk "{if ($1 + .0 != 1) print $0}' 

werden Sie auf diese praktische

Ohne kleine Beispieldatensätze, es ist nicht mehr zu tun gestartet.

IHTH

Verwandte Themen