[PYTHON] 100 Klicks in der Verarbeitung natürlicher Sprache Kapitel 2 Grundlagen des UNIX-Befehls (zweite Hälfte)

Eine Aufzeichnung zur Lösung der Probleme in der zweiten Hälfte von Kapitel 2. Das Ausführungsergebnis des UNIX-Befehls wird ebenfalls angezeigt.

</ i> 15. Geben Sie die letzten N Zeilen aus

Empfangen Sie die natürliche Zahl N beispielsweise über ein Befehlszeilenargument und zeigen Sie nur die letzten N Zeilen der Eingabe an. Verwenden Sie zur Bestätigung den Befehl tail.

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import sys

if len(sys.argv) == 3:
    N = int(sys.argv[1])
    f = open(sys.argv[2])
    lines = f.readlines()[::-1][0:N][::-1]
    for i in xrange(N):
        print lines[i].strip()
    f.close()
else:
    print "please input \'N\' and \'FILENAME\'"

# (python problem15.py 5 hightemp.txt)
#=>39 Hatoyama, Präfektur Saitama.9    1997-07-05
#=>Toyonaka 39, Osaka.9    1994-08-08
#=>Otsuki, Yamanashi 39.9    1990-07-19
#=>39 Tsuruoka, Präfektur Yamagata.9    1978-08-03
#=>Präfektur Aichi Nagoya 39.9    1942-08-02

Invertieren Sie das Array, das die Datei für jede Zeile liest, und erhalten Sie N Zeilen. Realisiert durch erneutes Invertieren und Ausgeben in der richtigen Reihenfolge. (Lesbarkeit ignoriert und diesen Vorgang in eine Zeile geschrieben)

tail -n 5 hightemp.txt

#=> (Die Ausgabe ist die gleiche wie oben)

</ i> 16. Teilen Sie die Datei in N.

Empfangen Sie die natürliche Zahl N mithilfe von Befehlszeilenargumenten und teilen Sie die Eingabedatei zeilenweise in N. Erzielen Sie die gleiche Verarbeitung mit dem Befehl split.

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import sys

if len(sys.argv) == 3:
    N = int(sys.argv[1])
    f = open(sys.argv[2])
    rows = f.readlines()
    n, mod = divmod(len(rows), N)
    if mod != 0:
        n += 1
    idx = 0
    for i in xrange(N):
        filename = "split_%s.txt" % (i + 1)
        g = open(filename, "w")
        for j in xrange(n):
            try:
                g.write(rows[idx + j])
            except:
                break
        idx += n
        g.close()
    f.close()

else:
    print "please input \'N\' and \'FILENAME\'"

# python problem16.py 5 hightemp.txt
#=> (split_1.txt〜split_5.Ausgabe an txt)

Um die Originaldatei in N zu teilen, berechnen Sie die Anzahl der Dateizeilen n nach der Teilung. Danach wird die erforderliche Anzahl von Zeilen in jede Datei ausgegeben.

split -l 5 hightemp.txt out.

#=> (out.aa, out.ab, ..., out.Ausgabe in eine Datei)

</ i> Es gibt einen Unterschied in der Bedeutung der Argumente zwischen dem Python-Skript und dem Befehl, aber ist dies die richtige Antwort ... <i class = "fa fa-question" -Kreis "> </ i>

</ i> 17. Unterschied in der Zeichenfolge in der ersten Spalte

Suchen Sie den Typ der Zeichenfolge in der ersten Spalte (eine Reihe verschiedener Zeichenfolgen). Verwenden Sie zur Bestätigung die Befehle sort und uniq.

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import sys

if len(sys.argv) == 2:
    f = open(sys.argv[1])
    str_set = set()
    for line in f.readlines():
        str_set.add(line.split()[0])
    f.close()
    for s in str_set:
    	print s
else:
    print "please input \'FILENAME\'"

# (python problem17.py hightemp.txt)
#=>Präfektur Aichi
#=>Präfektur Yamagata
#=>Präfektur Gifu
#=>Präfektur Chiba
#=>Saitama
#=>Präfektur Kochi
#=>Präfektur Gunma
#=>Präfektur Yamanashi
#=>Präfektur Wakayama
#=>Präfektur Ehime
#=>Präfektur Osaka
#=>Präfektur Shizuoka
cat col1.txt | sort | uniq

#=> (Die Ausgabe ist die gleiche wie oben)

</ i> 18. Sortieren Sie jede Zeile in absteigender Reihenfolge der Zahlen in der dritten Spalte

Ordnen Sie jede Zeile in umgekehrter Reihenfolge der Zahlen in der dritten Spalte an (Hinweis: Ordnen Sie den Inhalt jeder Zeile neu an, ohne ihn zu ändern). Verwenden Sie den Befehl sort zur Bestätigung (dieses Problem muss nicht mit dem Ergebnis der Ausführung des Befehls übereinstimmen).

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import sys

if len(sys.argv) == 2:
    f = open(sys.argv[1])
    lines = f.readlines()
    sorted_lines = sorted(lines, key=(lambda x:float(x.split()[2])), reverse=True)
    g = open("sorted_hightemp.txt", "w")
    for line in sorted_lines:
        g.write(line.strip() + "\n")
    g.close()
    f.close()
else:
    print "please input \'FILENAME\'"

# (python problem18.py hightemp.txt)
#=>Präfektur Kochi Egawasaki 41 2013-08-12
#=>40 Kumagai, Präfektur Saitama.9	2007-08-16
#=>40 Tajimi, Präfektur Gifu.9	2007-08-16
#=>Yamagata 40 Yamagata.8	1933-07-25
#=>Präfektur Yamanashi Kofu 40.7	2013-08-10
#=>Präfektur Wakayama Katsuragi 40.6	1994-08-08
#=>Präfektur Shizuoka Tenryu 40.6	1994-08-04
#=>40 Katsunuma, Präfektur Yamanashi.5	2013-08-10
#=>40 Koshiya, Präfektur Saitama.4	2007-08-16
#=>Präfektur Gunma Tatebayashi 40.3	2007-08-16
#=>Präfektur Gunma Kamisatomi 40.3	1998-07-04
#=>Ainishi 40, Präfektur Aichi.3	1994-08-05
#=>Präfektur Chiba Ushihisa 40.2	2004-07-20
#=>Präfektur Shizuoka Sakuma 40.2	2001-07-24
#=>40 Uwajima, Präfektur Ehime.2	1927-07-22
#=>40 Sakata, Präfektur Yamagata.1	1978-08-03
#=>Mino 40, Präfektur Gifu 2007-08-16
#=>Präfektur Gunma Maebashi 40 2001-07-24
#=>39 Shigehara, Chiba.9	2013-08-11
#=>39 Hatoyama, Präfektur Saitama.9	1997-07-05
#=>Toyonaka 39, Osaka.9	1994-08-08
#=>Otsuki, Yamanashi 39.9	1990-07-19
#=>39 Tsuruoka, Präfektur Yamagata.9	1978-08-03
#=>Präfektur Aichi Nagoya 39.9	1942-08-02

</ i> Ich habe das Programm geschrieben, weil es im Titel des Problems in absteigender Reihenfolge steht, aber die Originaldatei ist auch in absteigender Reihenfolge in der dritten Spalte ... </ i> Haben Sie den Kern des Problems falsch verstanden? ?? </ i> Wenn die Originaldatei in umgekehrter Reihenfolge vorliegt, können Sie reverse = False verwenden.

sort -r -k 3 hightemp.txt

#=> (Ausgabe weggelassen)

</ i> Wenn Sie in aufsteigender Reihenfolge sortieren möchten, können Sie die Option -r entfernen.

</ i> 19. Ermitteln Sie die Häufigkeit des Auftretens der Zeichenfolge in der ersten Spalte jeder Zeile und ordnen Sie sie in absteigender Reihenfolge der Häufigkeit des Auftretens an.

Ermitteln Sie die Häufigkeit des Auftretens der ersten Spalte jeder Zeile und zeigen Sie sie in absteigender Reihenfolge an. Verwenden Sie zur Bestätigung die Befehle cut, uniq und sort.

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import sys

if len(sys.argv) == 2:
    f = open(sys.argv[1])
    lines = f.readlines()
    count = {}
    for line in lines:
        l = line.split()[0]
        if count.has_key(l):
            count[l] += 1
        else:
            count[l] = 1
    for k, v in sorted(count.items(), key=(lambda x:x[1]), reverse=True):
        print k
else:
    print "please input \'FILENAME\'"

# (python problem19.py hightemp.txt)
#=>Präfektur Yamagata
#=>Saitama
#=>Präfektur Gunma
#=>Präfektur Yamanashi
#=>Präfektur Aichi
#=>Präfektur Gifu
#=>Präfektur Chiba
#=>Präfektur Shizuoka
#=>Präfektur Kochi
#=>Präfektur Wakayama
#=>Präfektur Ehime
#=>Präfektur Osaka

Erstellen Sie ein Diktat mit dem Wert der ersten Spalte als Schlüssel und der Anzahl der Vorkommen als Wert und geben Sie es in absteigender Reihenfolge der Anzahl der darauf basierenden Erscheinungen aus.

cut -f 1 hightemp.txt | sort  | uniq -c | sort -n -r | less

#=> (Ausgabe weggelassen)

Recommended Posts