[PYTHON] 100 points de traitement du langage naturel Chapitre 2 Bases des commandes UNIX (deuxième moitié)

Un enregistrement de la résolution des problèmes dans la seconde moitié du chapitre 2. Le résultat de l'exécution de la commande UNIX est également affiché.

</ i> 15. Sortir les N dernières lignes

Recevoir le nombre naturel N au moyen d'un argument de ligne de commande et n'afficher que les N dernières lignes de l'entrée. Utilisez la commande tail pour confirmation.

# -*- 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éfecture de Saitama.9    1997-07-05
#=>Toyonaka 39, Osaka.9    1994-08-08
#=>Otsuki, Yamanashi 39.9    1990-07-19
#=>39 Tsuruoka, Préfecture de Yamagata.9    1978-08-03
#=>Préfecture d'Aichi Nagoya 39.9    1942-08-02

Inversez le tableau qui lit le fichier pour chaque ligne et obtenez N lignes. Réalisé en l'inversant à nouveau et en le sortant dans l'ordre. (Lisibilité ignorée et écrit ce processus en une seule ligne)

tail -n 5 hightemp.txt

#=> (La sortie est la même que ci-dessus)

</ i> 16. Divisez le fichier en N

Recevez le nombre naturel N au moyen d'arguments de ligne de commande et divisez le fichier d'entrée en N ligne par ligne. Réalisez le même traitement avec la commande de fractionnement.

# -*- 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.Sortie vers txt)

Afin de diviser le fichier d'origine en N, calculez le nombre de lignes de fichier n après la division. Après cela, le nombre requis de lignes est généré dans chaque fichier.

split -l 5 hightemp.txt out.

#=> (out.aa, out.ab, ..., out.Sortie dans un fichier ae)

</ i> Il y a une différence dans la signification des arguments entre le script python et la commande, mais est-ce la bonne réponse ... <i class = "fa fa-question" -circle "> </ i>

</ i> 17. Différence dans la chaîne de caractères dans la première colonne

Recherchez le type de chaîne de caractères dans la première colonne (un ensemble de chaînes de caractères différentes). Utilisez les commandes sort et uniq pour confirmation.

# -*- 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éfecture d'Aichi
#=>Préfecture de Yamagata
#=>Préfecture de Gifu
#=>Préfecture de Chiba
#=>Saitama
#=>Préfecture de Kochi
#=>Préfecture de Gunma
#=>Préfecture de Yamanashi
#=>Préfecture de Wakayama
#=>Préfecture d'Ehime
#=>Préfecture d'Osaka
#=>Préfecture de Shizuoka
cat col1.txt | sort | uniq

#=> (La sortie est la même que ci-dessus)

</ i> 18. Trier chaque ligne par ordre décroissant des nombres de la troisième colonne

Disposez chaque ligne dans l'ordre inverse des nombres de la troisième colonne (Remarque: réorganisez le contenu de chaque ligne sans les changer) Utilisez la commande sort pour confirmation (ce problème ne doit pas nécessairement correspondre au résultat de l'exécution de la commande).

# -*- 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éfecture de Kochi Egawasaki 41 2013-08-12
#=>40 Kumagai, Préfecture de Saitama.9	2007-08-16
#=>Préfecture de Gifu Tajimi 40.9	2007-08-16
#=>Yamagata 40 Yamagata.8	1933-07-25
#=>Préfecture de Yamanashi Kofu 40.7	2013-08-10
#=>Préfecture de Wakayama Katsuragi 40.6	1994-08-08
#=>Préfecture de Shizuoka Tenryu 40.6	1994-08-04
#=>40 Katsunuma, préfecture de Yamanashi.5	2013-08-10
#=>40 Koshiya, Préfecture de Saitama.4	2007-08-16
#=>Préfecture de Gunma Tatebayashi 40.3	2007-08-16
#=>Préfecture de Gunma Kamisatomi 40.3	1998-07-04
#=>Ainishi 40, Préfecture d'Aichi.3	1994-08-05
#=>Préfecture de Chiba Ushihisa 40.2	2004-07-20
#=>Préfecture de Shizuoka Sakuma 40.2	2001-07-24
#=>40 Uwajima, Préfecture d'Ehime.2	1927-07-22
#=>40 Sakata, préfecture de Yamagata.1	1978-08-03
#=>Mino 40, préfecture de Gifu 2007-08-16
#=>Préfecture de Gunma Maebashi 40 2001-07-24
#=>39 Shigehara, Chiba.9	2013-08-11
#=>39 Hatoyama, Préfecture de Saitama.9	1997-07-05
#=>Toyonaka 39, Osaka.9	1994-08-08
#=>Otsuki, Yamanashi 39.9	1990-07-19
#=>39 Tsuruoka, Préfecture de Yamagata.9	1978-08-03
#=>Préfecture d'Aichi Nagoya 39.9	1942-08-02

</ i> J'écrivais le programme car il est en ordre décroissant dans le titre du problème, mais le fichier d'origine est également en ordre décroissant dans la troisième colonne ... </ i> Avez-vous mal interprété l'essentiel du problème? ?? </ i> Si l'ordre du fichier d'origine est inversé, vous pouvez définir reverse = False.

sort -r -k 3 hightemp.txt

#=> (Sortie omise)

</ i> Si vous voulez trier par ordre croissant, vous pouvez éliminer l'option -r.

</ i> 19. Trouvez la fréquence d'apparition de la chaîne de caractères dans la première colonne de chaque ligne et organisez-les par ordre décroissant de fréquence d'apparition.

Trouvez la fréquence d'apparition de la première colonne de chaque ligne et affichez-les par ordre décroissant. Utilisez les commandes cut, uniq et sort pour confirmation.

# -*- 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éfecture de Yamagata
#=>Saitama
#=>Préfecture de Gunma
#=>Préfecture de Yamanashi
#=>Préfecture d'Aichi
#=>Préfecture de Gifu
#=>Préfecture de Chiba
#=>Préfecture de Shizuoka
#=>Préfecture de Kochi
#=>Préfecture de Wakayama
#=>Préfecture d'Ehime
#=>Préfecture d'Osaka

Créez un dict avec la valeur de la première colonne comme clé et le nombre d'occurrences comme valeur, et sortez dans l'ordre décroissant du nombre d'apparitions en fonction de celui-ci.

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

#=> (Sortie omise)

Recommended Posts