2016-07-28 14 views
2

So habe ich eine Textdatei, die eine große Anzahl von Zeilen enthält. Jede Zeile ist eine lange Zeichenfolge ohne Leerzeichen. Die Zeile enthält jedoch mehrere Informationen. Das Programm weiß, wie man die wichtigen Informationen in jeder Zeile unterscheidet. Das Programm erkennt, dass die ersten 4 Ziffern/Buchstaben der Zeile mit einem bestimmten Instrument übereinstimmen. Hier ist ein kleiner Beispielteil der Textdatei.Finden Sie Zeilen, die teilweise übereinstimmen

Beispiel Textdatei

1002IPU3... 
    POIPIPU2... 
    1435IPU1... 
    1812IPU3... 
    BFTOIPD3... 
    1435IPD2... 

Wie Sie sehen können, gibt es zwei Linien, die 1435 innerhalb dieser Textdatei enthalten, die mit einem bestimmten Instrument zusammenfällt. Diese Zeilen sind jedoch nicht identisch. Das Programm, das ich benutze, kann seine Berechnung nicht durchführen, wenn es Duplikate der gleichen Station gibt (dh es gibt zwei 1435 * Stationen). Ich muss einen Weg finden, meine Textdateien zu durchsuchen und festzustellen, ob es Duplikate der Teilstrings gibt, die die Stationen in der Datei darstellen, sodass ich einen oder beide Duplikate löschen kann. Wenn ich BASH-Skript die Anzahl der Zeilen ausgeben könnte, die die Duplikate enthalten und was die Duplikatzeilen sagen, würde das geschätzt werden. Ich denke, dass es einen einfachen Weg dafür geben könnte, aber ich konnte keine Beispiele dafür finden. Deine Hilfe wird geschätzt.

+0

Ist 'sort -k1.1,1.4 file.txt | uniq -Dw4' Arbeit für Sie? – heemayl

+0

Also habe ich Ihren Befehl versucht und ich habe '>> $ sort -k1.1,1.4 text.file | uniq -Dw4 \ uniq: illegale Option - D \ Verwendung: uniq [-c | -d | -u] [-i] [-f Felder] [-s Zeichen] [Eingabe [Ausgabe]] 'Habe ich etwas falsch gemacht? Ich bin nur neugierig, ob Sie auf so etwas stoßen ... – Jon

+0

Sorry, ich bin immer noch neu in Stack Overflow und manchmal meine Kommentare seltsam aussehen. Wenn ich "\" benutze, ist das nur eine neue Zeile. – Jon

Antwort

0

Verwenden folgende Python-Skript (Syntax von 2,7 Python-Version verwendet)

#!/usr/bin/python 

file_name = "device.txt" 
f1 = open(file_name,'r') 
device = {} 
line_count = 0 
for line in f1: 
     line_count += 1 
     if device.has_key(line[:4]): 
       device[line[:4]] = device[line[:4]] + "," + str(line_count) 
     else: 
       device[line[:4]] = str(line_count) 
f1.close() 
print device 

hier das Skript jede Zeile liest und die anfänglichen 4 Zeichen jeder Zeile betrachtet wird als Gerätenamen und erzeugt ein Schlüsselwertpaar device mit Schlüssel Gerätenamen und Wert als Zeilennummern darstellt, in dem wir die Zeichenfolge (Gerätename) finden

folgenden würde ausgegeben werden

{'POIP': '2', '1435': '3,6', '1002': '1', '1812': '4', 'BFTO': '5'} 

das könnte dir helfen !!

+0

Entschuldigung, ich denke, ich hätte angeben sollen, dass ich die verschiedenen möglichen doppelten Sender überprüfen möchte, nicht nur Station 1435, also ich Ich möchte sicherstellen, dass in meiner aktuellen Datei keine Duplikate der Station POIP oder der Station 1812 usw. vorhanden sind. Die Datei, mit der ich arbeite, ist über 800 Zeilen lang. Hoffentlich macht das Sinn. – Jon

0

Wenn alles, was Sie tun möchten, ist festzustellen, ob es Duplikate (nicht notwendigerweise sie zählen oder beseitigen), das ist ein guter Ausgangspunkt wäre:

awk '{ if (++seen[substr($0, 1, 4)] > 1) printf "Duplicates found : %s\n",$0 }' inputfile.txt 

Für diese Angelegenheit, es ist ein guter Ausgangspunkt für Zählen oder Beseitigung auch es dauert nur ein bisschen mehr Arbeit ...

0

Wenn Sie die Anzahl der Duplikate:

awk '{a[substr($0,1,4)]++} END {for (i in a) {if(a[i]>1) print i": "a[i]}}' test.in 
1435: 2 

oder:

{ 
    a[substr($0,1,4)]++   # put prefixes to array and count them 
} 
END {       # in the end 
    for (i in a) {    # go thru all indexes 
    if(a[i]>1) print i": "a[i] # and print out the duplicate prefixes and their counts 
    } 
} 
0

Leicht Kreisverkehr, aber dies sollte Work-

cut -c 1-4 file.txt | sort -u > list 
for i in `cat list`; 
do 
echo -n "$i " 
grep -c ^"$i" file.txt  #This tells you how many occurrences of each 'station' 
done 

Dann können Sie tun, was Sie mit denen wollen, die mehr als einmal vorkommen.