Ich löse 100 Klopfen bei der Sprachverarbeitung in einer Lernsitzung, die sich auf interne Mitglieder, aber den Antwortcode und die Lösung konzentriert Dies ist eine Zusammenfassung der Tricks, die ich dabei nützlich fand. Der größte Teil des Inhalts wurde von mir selbst untersucht und verifiziert, enthält jedoch auch Informationen, die von anderen Mitgliedern der Studiengruppe geteilt wurden.
Dieses Mal werde ich die Grundlagen der UNIX-Befehle zusammenfassen, aber die vorhergehenden @ moriwo und @segavvy Der Artikel segavvy / items / fb50ba8097d59475f760) enthält bereits eine ziemlich ausführliche Erklärung, daher möchte ich die Erklärung in diesem Artikel leicht konservativ halten. Wenn Sie nach dem Lesen der folgenden Fragen Fragen haben, wird empfohlen, die Artikel beider Parteien über den obigen Link zu lesen.
Python
def count_lines():
with open('hightemp.txt') as file:
return len(file.readlines())
count_lines()
Ergebnis (Python)
24
UNIX
!wc -l hightemp.txt
Ergebnis (UNIX)
24 hightemp.txt
Der UNIX-Befehl war überwiegend präzise. Übrigens wird das !
Vor dem wc
verwendet, wenn UNIX-Befehle in JupyterLab oder Notebook ausgeführt werden (in einigen Fällen funktioniert es ohne das !
).
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'
Ergebnis (gemeinsam für Python und UNIX)
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
...
In Bezug auf das UNIX-Symbol "sed" sollte beachtet werden, dass das "\ t" nicht als Tabulator-Symbol erkannt wird, es sei denn, das "$" -Symbol wird hinzugefügt.
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
Wenn Sie das Ergebnis mit ! Head col1.txt col2.txt
überprüfen, sieht es wie folgt aus. Gleiches gilt, wenn ! Head col1_unix.txt col2_unix.txt
verwendet wird.
Ergebnis (Python)
==> col1.txt <==
Präfektur 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
Ergebnis (gemeinsam für Python und UNIX)
Präfektur Kochi Egawazaki
Kumagai, Präfektur Saitama
Tajimi, Präfektur Gifu
Präfektur Yamagata Yamagata
...
Um das Ergebnis zu überprüfen, verwenden Sie ! Head merge.txt
oder! Head merge_unix.txt
und Sie sollten die obige Ausgabe erhalten.
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
Ergebnis (gemeinsam für Python und UNIX)
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
Wenn Sie für Python eine Liste von einer Funktion zurückgeben möchten, schreiben Sie möglicherweise Folgendes:
Python
def show_head():
n = int(input())
with open('hightemp.txt') as file:
return [line for line in file.readlines()[:n]]
print(*show_head())
Andererseits ist es unter UNIX schwierig, eine Ganzzahl in der Befehlszeile wie Python zu empfangen. Sie können jedoch angeben, wie viele Zeilen angezeigt werden sollen, indem Sie eine Ganzzahl nach -
schreiben. Als angewandte Verwendung zum Beispiel am Ende der Antwort von "12"
UNIX
!cat hightemp.txt | sed $'s/\t/ /g' | head -5
Sie können auch nur die ersten 5 Zeilen schreiben und anzeigen.
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
Ergebnis (gemeinsam für Python und UNIX)
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
Fast das gleiche wie 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
Ergebnis (Python)
==> split1.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
==> split5.txt <==
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
Das Obige ist die Ausgabe von Python, die durch ! Head split1.txt split5.txt
bestätigt wurde.
Auf der anderen Seite funktioniert der obige UNIX-Befehl in meiner Umgebung nicht, daher habe ich dies mit Colab (Google Colaboratory) versucht. Es scheint, dass der Befehl -n
im Allgemeinen unter Linux bereitgestellt wird (@ IT). Es scheint nicht mit dem Standard-MacOS zu funktionieren.
Als ich das oben genannte in Colab ausführte, wurden 5 Dateien von "split_unix00" bis "split_unix04" erstellt, aber als ich versuchte, die Erweiterung "txt" hinzuzufügen, hatte ich das Gefühl, dass dies etwas problematisch sein würde. .. [@ moriwos Artikel](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) führt ein Implementierungsbeispiel mit awk
usw. ein, aber ich verwende Python Ich fragte mich, ob es einfacher wäre, den Code zu lesen.
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())
Ergebnis (Python)
{'Präfektur Chiba', 'Saitama', 'Präfektur Yamagata', 'Präfektur Wakayama', 'Präfektur Shizuoka', 'Präfektur Kochi', 'Präfektur Osaka', 'Präfektur Gifu', 'Präfektur Gunma', 'Präfektur Ehime', 'Präfektur Yamanashi', 'Präfektur Aichi'}
UNIX
!sort -u col1_unix.txt
Ergebnis (UNIX)
Präfektur Chiba
Saitama
Präfektur Osaka
Präfektur Yamagata
...
UNIX-Befehle können auch als ! Sort col1_unix.txt | uniq
geschrieben werden, indem der Sortier- und Deduplizierungsprozess weitergeleitet wird.
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()
Ergebnis (Python)
Prefect City Temp Date
23 Nagoya, Aichi 39.9 1942-08-02
21 Präfektur Yamanashi Otsuki 39.9 1990-07-19
20 Toyonaka, Osaka 39.9 1994-08-08
...
UNIX
!sort hightemp.txt -k 3
Ergebnis (UNIX)
Präfektur Aichi Nagoya 39.9 1942-08-02
39 Tsuruoka, Präfektur Yamagata.9 1978-08-03
Otsuki, Yamanashi 39.9 1990-07-19
Toyonaka 39, Osaka.9 1994-08-08
...
Ich bin nicht sicher, ob das Wort "umgekehrte Reihenfolge" die Umkehrung der ursprünglichen oder der absteigenden Reihenfolge bedeutet, aber ich habe versucht, es mit der letzteren Interpretation zu lösen. Ich bin besonders stark von diesem Problem betroffen, dass UNIX-Befehle kurz geschrieben werden können.
Python
def count_freq():
df = pd.read_csv('hightemp.txt', sep='\t', header=None)
return df[0].value_counts()
count_freq()
Ergebnis (Python)
Präfektur Gunma 3
Präfektur Yamanashi 3
Präfektur Yamagata 3
Präfektur Saitama 3
UNIX
!cut -f 1 hightemp.txt | sort | uniq -c | sort -r
Ergebnis (UNIX)
3 Präfektur Gunma
3 Präfektur Yamanashi
3 Präfektur Yamagata
3 Präfektur Saitama
Der UNIX-Befehl ist etwas länger, aber schneiden Sie zuerst die erste Spalte (cut -f 1
) aus, finden Sie dann ihre Häufigkeit ( sort | uniq -c
) und schließlich in umgekehrter Reihenfolge der Häufigkeit. Ich habe es so geschrieben, dass der Ablauf des Arrangierens (sort -r
) leicht zu verstehen ist.
Angesichts der hervorragenden Leistung von value_counts ()
von Pandas denke ich jedoch, dass es hier einfacher ist, Python zu verstehen.
Das ist alles für dieses Kapitel, aber wenn Sie einen Fehler machen, kommentieren Sie bitte.
Recommended Posts