[PYTHON] 100 Commandes de traitement du langage Knock UNIX apprises au chapitre 2

introduction

Je résous 100 coups sur le traitement du langage lors d'une session d'étude centrée sur les membres internes, mais le code de réponse et la solution Ceci est un résumé des astuces que j'ai trouvées utiles dans le processus. La plupart du contenu a été étudié et vérifié par moi-même, mais il contient également des informations partagées par d'autres membres du groupe d'étude.

Cette fois, je vais résumer les bases des commandes UNIX, mais les précédents @ moriwo et [@segavvy](https://qiita.com/ L'article segavvy / items / fb50ba8097d59475f760) a déjà une explication assez détaillée, donc j'aimerais garder l'explication dans cet article légèrement conservatrice. Si vous avez des questions après avoir lu ce qui suit, il est recommandé de consulter les articles des deux parties à partir du lien ci-dessus.

séries

environnement

code

10. Compter le nombre de lignes

Python


def count_lines():
    with open('hightemp.txt') as file:
        return len(file.readlines())

count_lines()

Résultat (Python)


24

UNIX


!wc -l hightemp.txt

Résultat (UNIX)


      24 hightemp.txt

La commande UNIX était extrêmement concise. Au fait, le ! Devant le wc est utilisé lors de l'exécution de commandes UNIX dans JupyterLab ou Notebook (dans certains cas, cela fonctionne sans le! ).

11. Remplacez les onglets par des espaces

Python


def replace_tabs():
    with open('hightemp.txt') as file:
        return file.read().replace('\t', ' ')
    
print(replace_tabs())

UNIX


!cat hightemp.txt | sed $'s/\t/ /g'

Résultat (commun à Python et UNIX)


Préfecture de Kochi Egawasaki 41 2013-08-12
40 Kumagai, Préfecture de Saitama.9 2007-08-16
40 Tajimi, Préfecture de Gifu.9 2007-08-16
Yamagata 40 Yamagata.8 1933-07-25
Préfecture de Yamanashi Kofu 40.7 2013-08-10
...

En ce qui concerne UNIX sed, j'ai pensé qu'il convient de noter que \ t n'est pas reconnu comme un symbole de tabulation à moins que le symbole $ ne soit ajouté.

12. Enregistrez la première colonne dans col1.txt et la deuxième colonne dans col2.txt

Python


import pandas as pd

def separate_columns():
    df = pd.read_csv('hightemp.txt', sep='\t', header=None)
    df.iloc[:,0].to_csv('col1.txt', header=False, index=False)
    df.iloc[:,1].to_csv('col2.txt', header=False, index=False)

separate_columns()

UNIX


!cut -f 1 hightemp.txt > col1_unix.txt
!cut -f 2 hightemp.txt > col2_unix.txt

Si vous vérifiez le résultat avec ! Head col1.txt col2.txt, ce sera comme suit. La même chose s'applique lorsque ! Head col1_unix.txt col2_unix.txt est utilisé.

Résultat (Python)


==> col1.txt <==
Préfecture de Kochi
Saitama
...
==> col2.txt <==
Egawazaki
Kumagai
...

13. Fusionnez col1.txt et col2.txt

Python


def merge_columns():
    with open('col1.txt') as col1_file, open('col2.txt') as col2_file, \
         open('merge.txt', mode='w') as new_file:
        
        for col1_line, col2_line in zip(col1_file, col2_file):
            new_file.write(f'{col1_line.rstrip()}\t{col2_line.rstrip()}\n')

merge_columns()

UNIX


!paste col[1-2].txt > merge_unix.txt

Résultat (commun à Python et UNIX)


Préfecture de Kochi Egawazaki
Kumagai, Préfecture de Saitama
Tajimi, préfecture de Gifu
Préfecture de Yamagata Yamagata
...

Pour vérifier le résultat, utilisez ! Head merge.txt ou! Head merge_unix.txt et vous devriez obtenir la sortie ci-dessus.

14. Sortie de N lignes depuis le début

Python


def show_head():
    n = int(input())

    with open('hightemp.txt') as file:
        for line in file.readlines()[:n]:
            print(line.rstrip())
    
show_head()

UNIX


!head -3 hightemp.txt

Résultat (commun à Python et UNIX)


Préfecture de Kochi Egawasaki 41 2013-08-12
40 Kumagai, Préfecture de Saitama.9	2007-08-16
40 Tajimi, Préfecture de Gifu.9	2007-08-16

Pour Python, si vous souhaitez renvoyer une liste à partir d'une fonction, vous pouvez écrire quelque chose comme ceci:

Python


def show_head():
    n = int(input())

    with open('hightemp.txt') as file:
        return [line for line in file.readlines()[:n]]
    
print(*show_head())

Par contre, sous UNIX, il est difficile de recevoir un entier sur la ligne de commande comme Python, mais vous pouvez spécifier le nombre de lignes à afficher en écrivant un entier après -. En tant qu'usage appliqué, par exemple, à la fin de la réponse de "12"

UNIX


!cat hightemp.txt | sed $'s/\t/ /g' | head -5

Vous pouvez également écrire et afficher uniquement les 5 premières lignes.

15. Sortez les N dernières lignes

Python


def show_tail():
    n = int(input())

    with open('hightemp.txt') as file:
        return [line for line in file.readlines()[-n:]]

print(*show_tail())

UNIX


!tail -3 hightemp.txt

Résultat (commun à Python et UNIX)


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

Presque le même que 14.

16. Divisez le fichier en N

Python


import math

def split_file():
    n = int(input())

    with open('hightemp.txt') as file:
        lines = file.readlines()
        num = math.ceil(len(lines) / n)
        for i in range(n):
            with open('split{}.txt'.format(i + 1), mode='w') as new_file:
                text = ''.join(lines[i * num:(i + 1) * num])
                new_file.write(text)

split_file()

UNIX


!split -n 5 -d hightemp.txt split_unix

Résultat (Python)


==> split1.txt <==
Préfecture de Kochi Egawasaki 41 2013-08-12
40 Kumagai, Préfecture de Saitama.9	2007-08-16
40 Tajimi, Préfecture de Gifu.9	2007-08-16
Yamagata 40 Yamagata.8	1933-07-25
Préfecture de Yamanashi Kofu 40.7	2013-08-10

==> split5.txt <==
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

Ce qui précède est la sortie de Python confirmée par ! Head split1.txt split5.txt.

D'un autre côté, la commande UNIX ci-dessus ne fonctionne pas dans mon environnement, j'ai donc essayé cela avec Colab (Google Colaboratory). Il semble que la commande -n soit généralement fournie sous Linux (@ IT). Cela ne semble pas fonctionner avec le macOS par défaut.

Lorsque j'ai exécuté ce qui précède dans Colab, 5 fichiers de split_unix00 à split_unix04 ont été créés, mais quand j'ai essayé d'y ajouter l'extension txt, j'ai senti que ce serait un peu gênant. .. [Article de @ Moriwo](https://qiita.com/moriwo/items/9d2a73a75f543e2ea6af#16-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3 % 82% 92n% E5% 88% 86% E5% 89% B2% E3% 81% 99% E3% 82% 8B) présente un exemple d'implémentation utilisant ʻawk` etc., mais j'utilise Python Je me suis demandé s'il serait plus facile de lire le code.

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

Python


import pandas as pd

def get_chars_set():
    df = pd.read_csv('hightemp.txt', sep='\t', header=None)
    return set(df.iloc[:, 0])

print(get_chars_set())

Résultat (Python)


{'Préfecture de Chiba', 'Saitama', 'Préfecture de Yamagata', 'Préfecture de Wakayama', 'Préfecture de Shizuoka', 'Préfecture de Kochi', 'Préfecture d'Osaka', 'Préfecture de Gifu', 'Préfecture de Gunma', 'Préfecture d'Ehime', 'Préfecture de Yamanashi', 'Préfecture d'Aichi'}

UNIX


!sort -u col1_unix.txt

Résultat (UNIX)


Préfecture de Chiba
Saitama
Préfecture d'Osaka
Préfecture de Yamagata
...

Les commandes UNIX peuvent également être écrites sous la forme ! Trier col1_unix.txt | uniq en exécutant le processus de tri et de déduplication.

18. Triez chaque ligne dans l'ordre décroissant des nombres dans la troisième colonne

Python


def sort_rows():
    df = pd.read_csv('hightemp.txt', sep='\t', header=None)
    df.rename(columns={0: 'Prefect', 1: 'City', 2: 'Temp', 3: 'Date'}, inplace=True)
    df.sort_values(by='Temp', inplace=True)
    return df

sort_rows()

Résultat (Python)


   Prefect  City  Temp        Date
23 Nagoya, Aichi 39.9  1942-08-02
21 Préfecture de Yamanashi Otsuki 39.9  1990-07-19
20 Toyonaka, Osaka 39.9  1994-08-08
...

UNIX


!sort hightemp.txt -k 3

Résultat (UNIX)


Préfecture d'Aichi Nagoya 39.9	1942-08-02
39 Tsuruoka, Préfecture de Yamagata.9	1978-08-03
Otsuki, Yamanashi 39.9	1990-07-19
Toyonaka 39, Osaka.9	1994-08-08
...

Je ne sais pas si le mot «ordre inverse» signifie l'inverse de l'original ou l'ordre décroissant, mais j'ai essayé de le résoudre avec cette dernière interprétation. Je pense particulièrement à ce problème que les commandes UNIX peuvent être écrites courtes.

19. Recherchez 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.

Python


def count_freq():
    df = pd.read_csv('hightemp.txt', sep='\t', header=None)
    return df[0].value_counts()
    
count_freq()

Résultat (Python)


Préfecture de Gunma 3
Préfecture de Yamanashi 3
Préfecture de Yamagata 3
Préfecture de Saitama 3

UNIX


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

Résultat (UNIX)


3 Préfecture de Gunma
3 Préfecture de Yamanashi
3 Préfecture de Yamagata
3 Préfecture de Saitama

La commande UNIX est un peu plus longue, mais coupez d'abord la première colonne (cut -f 1), puis trouvez sa fréquence ( sort | uniq -c), et enfin dans l'ordre inverse de la fréquence. Je l'ai écrit pour que le déroulement de l'arrangement (sort -r) soit facile à comprendre.

Cependant, compte tenu de l'excellence de value_counts () des pandas, je pense qu'il est plus facile de comprendre l'utilisation de Python ici.

Résumé

C'est tout pour ce chapitre, mais si vous faites une erreur, veuillez commenter.

Recommended Posts

100 Commandes de traitement du langage Knock UNIX apprises au chapitre 2
100 Language Processing Knock 2020 Chapitre 2: Commandes UNIX
100 Traitement du langage Knock Expressions régulières apprises au chapitre 3
100 Language Processing Knock Chapitre 1 en Python
[Traitement du langage 100 coups 2020] Chapitre 2: Commandes UNIX
100 Traitement du langage Knock Chapitre 1
100 Language Processing Knock 2020 Chapitre 3
100 Language Processing Knock 2020 Chapitre 2
J'ai essayé de résoudre 100 traitements linguistiques Knock 2020 version [Chapitre 2: Commandes UNIX 10 à 14]
J'ai essayé de résoudre 100 traitements linguistiques Knock 2020 version [Chapitre 2: Commandes UNIX 15-19]
100 traitements du langage frappent l'analyse morphologique apprise au chapitre 4
100 Language Processing Knock Chapitre 1 (Python)
100 Language Processing Knock Chapitre 2 (Python)
100 Language Processing Knock: Chapitre 2 Principes de base des commandes UNIX (à l'aide de pandas)
100 Language Processing Knock 2015 Chapitre 5 Analyse des dépendances (40-49)
100 traitements de langage avec Python
100 Language Processing Knock 2020 Chapitre 4: Analyse morphologique
100 Language Processing Knock 2020 Chapitre 9: RNN, CNN
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 3
100 traitements de langage avec Python (chapitre 3)
100 Language Processing Knock: Chapitre 1 Mouvement préparatoire
100 Language Processing Knock 2020 Chapitre 6: Apprentissage automatique
100 Traitement du langage Knock Chapitre 4: Analyse morphologique
100 Language Processing Knock 2020 Chapitre 10: Traduction automatique (90-98)
100 Language Processing Knock 2020 Chapitre 5: Analyse des dépendances
100 Traitement du langage Knock 2020 Chapitre 7: Vecteur de mots
100 Language Processing Knock 2020 Chapitre 8: Neural Net
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 1
100 Language Processing Knock 2020 Chapitre 1: Mouvement préparatoire
100 Language Processing Knock Chapitre 1 par Python
100 Language Processing Knock 2020 Chapitre 3: Expressions régulières
100 Language Processing Knock 2015 Chapitre 4 Analyse morphologique (30-39)
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 2
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 4
100 points de traitement du langage naturel Chapitre 2 Bases des commandes UNIX (deuxième moitié)
100 points de traitement du langage naturel Chapitre 2 Bases des commandes UNIX (première moitié)
100 coups de traitement linguistique (2020): 28
100 coups de traitement linguistique (2020): 38
100 traitement de la langue frapper 00 ~ 02
J'ai fait 100 traitements linguistiques Knock 2020 avec GiNZA v3.1 Chapitre 4
100 traitements de langage avec Python (chapitre 2, partie 2)
100 traitements de langage avec Python (chapitre 2, partie 1)
[Programmeur nouveau venu "100 language processing knock 2020"] Résoudre le chapitre 1
100 traitements linguistiques Knock 2020 [00 ~ 39 réponse]
100 langues de traitement knock 2020 [00-79 réponse]
100 traitements linguistiques Knock 2020 [00 ~ 69 réponse]
100 coups de traitement du langage amateur: 17
100 traitements linguistiques Knock 2020 [00 ~ 49 réponse]
100 Traitement du langage Knock-52: Stemming
100 coups de traitement du langage ~ Chapitre 1
100 coups de langue amateur: 07
Le traitement de 100 langues frappe le chapitre 2 (10 ~ 19)
100 coups de traitement du langage amateur: 09
100 coups en traitement du langage amateur: 47
Traitement 100 langues knock-53: Tokenisation
100 coups de traitement du langage amateur: 97
100 traitements linguistiques Knock 2020 [00 ~ 59 réponse]
100 coups de traitement du langage amateur: 67
[Programmer newcomer "100 language processing knock 2020"] Résoudre le chapitre 2 [Première moitié: 10 ~ 15]
100 coups de traitement du langage avec Python 2015
100 traitement du langage Knock-51: découpage de mots