"Chapitre 2: Principes de base des commandes UNIX" De Language Processing 100 Knock 2015 Il s'agit d'un enregistrement de ecei.tohoku.ac.jp/nlp100/#ch2).
Le chapitre 2 est lié aux opérations sur les fichiers CSV. C'est un examen de ce que j'ai fait il y a plus d'un an. Au moment où je l'ai fait, je me suis dit "Je n'ai pas besoin d'utiliser des commandes UNIX, mais Python va bien", mais lorsqu'il s'agit de gros fichiers, les commandes UNIX sont généralement plus rapides. ** Les commandes UNIX méritent d'être rappelées **.
Cette fois, j'utilise beaucoup de packages Pandas
pour la partie Python. C'est vraiment pratique pour gérer des données matricielles telles que CSV.
type | version | Contenu |
---|---|---|
OS | Ubuntu18.04.01 LTS | Il fonctionne virtuellement |
pyenv | 1.2.15 | J'utilise pyenv car j'utilise parfois plusieurs environnements Python |
Python | 3.6.9 | python3 sur pyenv.6.J'utilise 9 3.7 ou 3.Il n'y a aucune raison profonde de ne pas utiliser la série 8 Les packages sont gérés à l'aide de venv |
Découvrez les outils UNIX utiles pour la recherche et l'analyse des données. Grâce à ces réimplémentations, vous ferez l'expérience de l'écosystème des outils existants tout en améliorant vos compétences en programmation.
head, tail, cut, paste, split, sort, uniq, sed, tr, expand
hightemp.txt enregistre la température la plus élevée au Japon en tant que «préfecture», «point» et «℃». Il s'agit d'un fichier stocké dans le format délimité par des tabulations de «jour». Créez un programme qui effectue le traitement suivant et exécutez hightemp.txt en tant que fichier d'entrée. De plus, exécutez le même processus avec une commande UNIX et vérifiez le résultat de l'exécution du programme.
Comptez le nombre de lignes. Utilisez la commande wc pour confirmation.
En Python, il devrait être le plus rapide à lire à la fois avec readlines
(je n'ai pas beaucoup vérifié).
Partie Python
print(len(open('./hightemp.txt').readlines()))
Résultat de sortie du terminal
24
wc est une abréviation de Word Count. Comptez le code de saut de ligne avec l'option -l
. ** Les gros fichiers sont utiles car il faut du temps simplement pour les ouvrir avec un éditeur de texte **.
Partie Bash
wc hightemp.txt -l
Résultat de sortie du terminal
24 hightemp.txt
Remplacez chaque onglet par un espace. Utilisez la commande sed, la commande tr ou la commande expand pour confirmation.
Remplacez en utilisant la fonction replace
. J'utilise pprint
car il est difficile de voir le résultat sans saut de ligne.
Partie Python
from pprint import pprint
with open('./hightemp.txt') as f:
pprint([line.replace('\t', ' ')for line in f])
Résultat de sortie du terminal
['Préfecture de Kochi Egawasaki 41 2013-08-12\n',
'40 Kumagai, Préfecture de Saitama.9 2007-08-16\n',
'40 Tajimi, Préfecture de Gifu.9 2007-08-16\n',
Omission
'Otsuki, Yamanashi 39.9 1990-07-19\n',
'39 Tsuruoka, Préfecture de Yamagata.9 1978-08-03\n',
'Préfecture d'Aichi Nagoya 39.9 1942-08-02\n']
sed
peut remplacer des chaînes et supprimer des lignes. L'exécution de cette commande imprime uniquement le résultat sur le terminal, elle ne met pas à jour le contenu du fichier. J'ai fait référence à "[sed] Remplacer les chaînes de caractères et supprimer les lignes".
Partie Bash
sed 's/\t/ /g' ./hightemp.txt
Résultat de sortie du terminal
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
Omission
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
Enregistrez uniquement la première colonne de chaque ligne sous col1.txt et la deuxième colonne sous col2.txt. Utilisez la commande cut pour confirmation.
J'ai utilisé «Pandas». Les colonnes à lire par le paramètre ʻusecols` sont limitées aux 1ère et 2ème colonnes. C'est pratique.
Partie Python
import pandas as pd
df = pd.read_table('./hightemp.txt', header=None, usecols=[0, 1])
df[0].to_csv('012.col1.txt',index=False, header=False)
df[1].to_csv('012.col2.txt',index=False, header=False)
Vérifiez le contenu avec «cut». J'ai fait référence à "[cut] command-cut out from a line in fixed length or field units".
Partie Bash
cut -f 1 ./hightemp.txt
cut -f 2 ./hightemp.txt
Résultat de sortie du terminal(1ère rangée)
Préfecture de Kochi
Saitama
Préfecture de Gifu
Omission
Préfecture de Yamanashi
Préfecture de Yamagata
Préfecture d'Aichi
Résultat de sortie du terminal(2e rangée)
Egawazaki
Kumagai
Tajimi
Yamagata
Omission
Otsuki
Tsuruoka
Nagoya
Combinez les col1.txt et col2.txt créés en 12 pour créer un fichier texte dans lequel les première et deuxième colonnes du fichier d'origine sont disposées en tabulation. Utilisez la commande coller pour confirmation.
J'ai lu deux fichiers avec pandas
et les ai connectés.
Partie Python
import pandas as pd
result = pd.read_csv('012.col1.txt', header=None)
result[1] = pd.read_csv('012.col2.txt', header=None)
result.to_csv('013.col1_2.txt', index=False, header=None, sep='\t')
J'ai fait référence à "Paste command summary [Linux command collection]". Le résultat de sortie est omis.
Partie Bash
paste 012.col1.txt 012.col2.txt
Recevoir le nombre naturel N au moyen d'un argument de ligne de commande et afficher uniquement les N premières lignes de l'entrée. Utilisez la commande head pour confirmation.
La fonction «input» reçoit l'argument.
Partie Python
from pprint import pprint
n = int(input('N Lines--> '))
with open('hightemp.txt') as f:
for i, line in enumerate(f):
if i < n:
pprint(line)
else:
break
Résultat de sortie du terminal
'Préfecture de Kochi\t Egawasaki\t41\t2013-08-12\n'
'Saitama\t Kumagai\t40.9\t2007-08-16\n'
'Préfecture de Gifu\t Tajimi\t40.9\t2007-08-16\n'
Je me suis référé au "Résumé détaillé de la commande head affiché depuis le début du fichier [Linux command collection]".
Partie Bash
head hightemp.txt -n 3
Résultat de sortie du terminal
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
Recevez le nombre naturel N au moyen d'un argument de ligne de commande et n'affichez que les N dernières lignes de l'entrée. Utilisez la commande tail pour confirmation.
C'était assez déroutant. Je ne voulais pas lire tous les éléments lorsque le fichier était volumineux, donc après avoir vérifié tous les éléments avec le paquet Linux head
, linecache
package Je pensais que j'utiliserais .html), mais si c'est le cas, tail
est très bien. J'ai fini par utiliser «readlines».
Partie Python
from pprint import pprint
n = int(input('N Lines--> '))
with open('hightemp.txt') as f:
pprint(f.readlines()[-n:])
Résultat de sortie du terminal
['Préfecture de Yamanashi\t Otsuki\t39.9\t1990-07-19\n',
'Préfecture de Yamagata\t Tsuruoka\t39.9\t1978-08-03\n',
'Préfecture d'Aichi\t Nagoya\t39.9\t1942-08-02\n']
Partie Bash
tail hightemp.txt -n 3
Résultat de sortie du terminal
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
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.
Le quotient est arrondi à l'aide de la fonction ceil
du package math
.
L'écriture de fichier est ajoutée en une seule fois avec la fonction writelines
.
Partie Python
import math
n = int(input('N spilits--> '))
with open('./hightemp.txt') as f:
lines = f.readlines()
unit = math.ceil(len(lines) / n)
for i in range(0, n):
with open('016.hightemp{}.txt'.format(i), 'w') as out_file:
out_file.writelines(lines[i*unit:(i+1)*unit])
J'ai fait référence à «[split] command-split files».
Partie Bash
split -n 3 -d hightemp.txt 016.hightemp-u
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.
J'ai utilisé la fonction «pandas» «unique». pandas
rend ce type de traitement très facile.
Partie Python
import pandas as pd
df = pd.read_table('hightemp.txt', header=None, usecols=[0])
print(df[0].unique())
Résultat de sortie du terminal
['Préfecture de Kochi' 'Saitama' 'Préfecture de Gifu' 'Préfecture de Yamagata' 'Préfecture de Yamanashi' 'Préfecture de Wakayama' 'Préfecture de Shizuoka' 'Préfecture de Gunma' 'Préfecture d'Aichi' 'Préfecture de Chiba' 'Préfecture d'Ehime' 'Préfecture d'Osaka']
J'ai fait référence à "Un résumé détaillé de la commande de tri [collection de commandes Linux]".
Partie Bash
cut --fields=1 hightemp.txt | sort | uniq > result.txt
Résultat de sortie du terminal
Préfecture de Chiba
Préfecture de Wakayama
Saitama
Préfecture d'Osaka
Préfecture de Yamagata
Préfecture de Yamanashi
Préfecture de Gifu
Préfecture d'Ehime
Préfecture d'Aichi
Préfecture de Gunma
Préfecture de Shizuoka
Préfecture de Kochi
Disposez chaque ligne dans l'ordre inverse des nombres de la troisième colonne (Remarque: réorganisez le contenu de chaque ligne sans 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).
J'ai utilisé la fonction sort_values
de pandas
.
Partie Python
import pandas as pd
df = pd.read_table('hightemp.txt', header=None, usecols=[0])
print(df.sort_values(2, ascending=False))
Résultat de sortie du terminal
0 1 2 3
0 Préfecture de Kochi Egawasaki 41.0 2013-08-12
2 Tajimi, préfecture de Gifu 40.9 2007-08-16
1 Kumagai 40, Préfecture de Saitama.9 2007-08-16
Omission
21 Préfecture de Yamanashi Otsuki 39.9 1990-07-19
22 Tsuruoka, préfecture de Yamagata 39.9 1978-08-03
23 Nagoya, Aichi 39.9 1942-08-02
Partie Bash
sort hightemp.txt -k 3 -n -r
Résultat de sortie du terminal
Préfecture de Kochi Egawasaki 41 2013-08-12
40 Tajimi, Préfecture de Gifu.9 2007-08-16
40 Kumagai, Préfecture de Saitama.9 2007-08-16
Omission
Toyonaka 39, Osaka.9 1994-08-08
39 Hatoyama, Préfecture de Saitama.9 1997-07-05
39 Shigehara, Chiba.9 2013-08-11
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.
J'ai utilisé la fonction «value_counts» de «pandas».
Partie Python
import pandas as pd
df = pd.read_table('hightemp.txt', header=None, usecols=[0])
print(df[0].value_counts(ascending=False))
Résultat de sortie du terminal
Préfecture de Saitama 3
Préfecture de Yamanashi 3
Préfecture de Yamagata 3
Omission
Préfecture d'Ehime 1
Préfecture de Kochi 1
Préfecture d'Osaka 1
Partie Bash
cut -f 1 hightemp.txt | sort | uniq -c | sort -r
Résultat de sortie du terminal
3 Préfecture de Gunma
3 Préfecture de Yamanashi
3 Préfecture de Yamagata
Omission
1 Préfecture d'Ehime
1 Préfecture d'Osaka
1 Préfecture de Wakayama
Recommended Posts