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.
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!
).
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é.
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
...
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.
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.
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.
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.
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.
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.
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.
C'est tout pour ce chapitre, mais si vous faites une erreur, veuillez commenter.
Recommended Posts