"Kapitel 2: Grundlagen von UNIX-Befehlen" Von Language Processing 100 Knock 2015 Es ist eine Aufzeichnung von ecei.tohoku.ac.jp/nlp100/#ch2). Kapitel 2 befasst sich mit CSV-Dateivorgängen. Dies ist eine Überprüfung dessen, was ich vor über einem Jahr getan habe. Zu der Zeit, als ich es tat, dachte ich "Ich muss keine UNIX-Befehle verwenden, aber Python ist in Ordnung", aber beim Umgang mit großen Dateien sind UNIX-Befehle im Allgemeinen schneller. ** UNIX-Befehle sind es wert, in Erinnerung zu bleiben **. Dieses Mal verwende ich viele Pandas-Pakete für den Python-Teil. Es ist sehr praktisch für den Umgang mit Matrixdaten wie CSV.
Art | Ausführung | Inhalt |
---|---|---|
OS | Ubuntu18.04.01 LTS | Es läuft virtuell |
pyenv | 1.2.15 | Ich benutze pyenv, weil ich manchmal mehrere Python-Umgebungen benutze |
Python | 3.6.9 | python3 auf pyenv.6.Ich benutze 9 3.7 oder 3.Es gibt keinen tiefen Grund, keine 8er-Serie zu verwenden Pakete werden mit venv verwaltet |
Erleben Sie nützliche UNIX-Tools für Forschung und Datenanalyse. Durch diese Neuimplementierungen erfahren Sie das Ökosystem vorhandener Tools und verbessern gleichzeitig Ihre Programmierkenntnisse.
head, tail, cut, paste, split, sort, uniq, sed, tr, expand
hightemp.txt zeichnet die höchste Temperatur in Japan als "Präfektur", "Punkt" und "℃" auf. Dies ist eine Datei, die im tabulatorgetrennten Format "Tag" gespeichert ist. Erstellen Sie ein Programm, das die folgende Verarbeitung ausführt, und führen Sie hightemp.txt als Eingabedatei aus. Führen Sie außerdem denselben Prozess mit einem UNIX-Befehl aus und überprüfen Sie das Ausführungsergebnis des Programms.
Zählen Sie die Anzahl der Zeilen. Verwenden Sie zur Bestätigung den Befehl wc.
In Python sollte es am schnellsten sein, mit "readlines" sofort zu lesen (ich habe nicht viel überprüft).
Python-Teil
print(len(open('./hightemp.txt').readlines()))
Ergebnis der Terminalausgabe
24
wc ist eine Abkürzung für Word Count. Zählen Sie den Zeilenvorschubcode mit der Option -l
. ** Große Dateien sind nützlich, da das Öffnen mit einem Texteditor einige Zeit in Anspruch nimmt **.
Bash Teil
wc hightemp.txt -l
Ergebnis der Terminalausgabe
24 hightemp.txt
Ersetzen Sie jede Registerkarte durch ein Leerzeichen. Verwenden Sie zur Bestätigung den Befehl sed, den Befehl tr oder den Befehl expand.
Ersetzen Sie mit der Funktion "Ersetzen". Ich benutze "pprint", weil es schwierig ist, das Ergebnis ohne Zeilenumbrüche zu sehen.
Python-Teil
from pprint import pprint
with open('./hightemp.txt') as f:
pprint([line.replace('\t', ' ')for line in f])
Ergebnis der Terminalausgabe
['Präfektur Kochi Egawasaki 41 2013-08-12\n',
'40 Kumagai, Präfektur Saitama.9 2007-08-16\n',
'40 Tajimi, Präfektur Gifu.9 2007-08-16\n',
Unterlassung
'Otsuki, Yamanashi 39.9 1990-07-19\n',
'39 Tsuruoka, Präfektur Yamagata.9 1978-08-03\n',
'Präfektur Aichi Nagoya 39.9 1942-08-02\n']
sed
kann Zeichenfolgen ersetzen und Zeilen löschen. Wenn Sie diesen Befehl ausführen, wird nur das Ergebnis auf dem Terminal gedruckt, der Inhalt der Datei wird nicht aktualisiert. Ich habe auf ["[sed] Zeichenketten ersetzen und Zeilen löschen"] verwiesen (http://tech.nikkeibp.co.jp/it/article/COLUMN/20060227/230879/).
Bash Teil
sed 's/\t/ /g' ./hightemp.txt
Ergebnis der Terminalausgabe
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
Unterlassung
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
Speichern Sie die extrahierte Spalte jeder Zeile als col1.txt und die extrahierte Spalte 2 als col2.txt. Verwenden Sie zur Bestätigung den Befehl cut.
Ich habe "Pandas" benutzt. Die vom Parameter "usecols" gelesenen Spalten sind auf die 1. und 2. Spalte beschränkt. Es ist bequem.
Python-Teil
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)
Überprüfen Sie den Inhalt mit cut
. Ich bezog mich auf "[cut] befehlsausschnitt aus einer Zeile in fester Länge oder Feldeinheiten".
Bash Teil
cut -f 1 ./hightemp.txt
cut -f 2 ./hightemp.txt
Ergebnis der Terminalausgabe(1. Reihe)
Präfektur Kochi
Saitama
Präfektur Gifu
Unterlassung
Präfektur Yamanashi
Präfektur Yamagata
Präfektur Aichi
Ergebnis der Terminalausgabe(2. Reihe)
Egawazaki
Kumagai
Tajimi
Yamagata
Unterlassung
Otsuki
Tsuruoka
Nagoya
Kombinieren Sie die in 12 erstellten Spalten col1.txt und col2.txt, um eine Textdatei zu erstellen, in der die erste und die zweite Spalte der Originaldatei tabulatorgetrennt angeordnet sind. Verwenden Sie zur Bestätigung den Befehl Einfügen.
Ich lese zwei Dateien mit "Pandas" und verbinde sie.
Python-Teil
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')
Ich habe auf "Befehlszusammenfassung einfügen [Linux-Befehlssammlung]" verwiesen. Das Ausgabeergebnis wird weggelassen.
Bash Teil
paste 012.col1.txt 012.col2.txt
Empfangen Sie die natürliche Zahl N beispielsweise über ein Befehlszeilenargument und zeigen Sie nur die ersten N Zeilen der Eingabe an. Verwenden Sie zur Bestätigung den Befehl head.
Die Funktion input
empfängt das Argument.
Python-Teil
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
Ergebnis der Terminalausgabe
'Präfektur Kochi\t Egawasaki\t41\t2013-08-12\n'
'Saitama\t Kumagai\t40.9\t2007-08-16\n'
'Präfektur Gifu\t Tajimi\t40.9\t2007-08-16\n'
Ich verwies auf "Detaillierte Zusammenfassung des Befehls head, der ab dem Anfang der Datei angezeigt wird [Linux-Befehlssammlung]".
Bash Teil
head hightemp.txt -n 3
Ergebnis der Terminalausgabe
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
Empfangen Sie die natürliche Zahl N beispielsweise über ein Befehlszeilenargument und zeigen Sie nur die letzten N Zeilen der Eingabe an. Verwenden Sie zur Bestätigung den Befehl tail.
Das war ziemlich verwirrend. Ich wollte nicht alle Elemente lesen, wenn die Datei groß war, also nachdem ich alle Elemente mit dem Linux-Paket "head", "linecache" -Paket überprüft hatte. Ich dachte, ich würde .html verwenden), aber wenn ja, ist "Schwanz" in Ordnung. Am Ende habe ich "Readlines" verwendet.
Python-Teil
from pprint import pprint
n = int(input('N Lines--> '))
with open('hightemp.txt') as f:
pprint(f.readlines()[-n:])
Ergebnis der Terminalausgabe
['Präfektur Yamanashi\t Otsuki\t39.9\t1990-07-19\n',
'Präfektur Yamagata\t Tsuruoka\t39.9\t1978-08-03\n',
'Präfektur Aichi\t Nagoya\t39.9\t1942-08-02\n']
Bash Teil
tail hightemp.txt -n 3
Ergebnis der Terminalausgabe
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
Empfangen Sie die natürliche Zahl N beispielsweise über Befehlszeilenargumente und teilen Sie die Eingabedatei zeilenweise in N. Erzielen Sie die gleiche Verarbeitung mit dem Befehl split.
Der Quotient wird mit der Funktion "Ceil" des Pakets "math" aufgerundet. Das Schreiben von Dateien wird mit der Funktion "writelines" auf einmal hinzugefügt.
Python-Teil
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])
Ich habe auf ["[split] command-split files"] verwiesen (http://www.atmarkit.co.jp/ait/articles/1711/24/news016.html).
Bash Teil
split -n 3 -d hightemp.txt 016.hightemp-u
Suchen Sie den Typ der Zeichenfolge in der ersten Spalte (eine Reihe verschiedener Zeichenfolgen). Verwenden Sie zur Bestätigung die Befehle sort und uniq.
Ich habe die "einzigartige" Funktion von "Pandas" verwendet. pandas
macht diese Art der Verarbeitung sehr einfach.
Python-Teil
import pandas as pd
df = pd.read_table('hightemp.txt', header=None, usecols=[0])
print(df[0].unique())
Ergebnis der Terminalausgabe
['Präfektur Kochi' 'Saitama' 'Präfektur Gifu' 'Präfektur Yamagata' 'Präfektur Yamanashi' 'Präfektur Wakayama' 'Präfektur Shizuoka' 'Präfektur Gunma' 'Präfektur Aichi' 'Präfektur Chiba' 'Präfektur Ehime' 'Präfektur Osaka']
Ich verwies auf "Eine detaillierte Zusammenfassung des Sortierbefehls [Linux-Befehlssammlung]".
Bash Teil
cut --fields=1 hightemp.txt | sort | uniq > result.txt
Ergebnis der Terminalausgabe
Präfektur Chiba
Präfektur Wakayama
Saitama
Präfektur Osaka
Präfektur Yamagata
Präfektur Yamanashi
Präfektur Gifu
Präfektur Ehime
Präfektur Aichi
Präfektur Gunma
Präfektur Shizuoka
Präfektur Kochi
Ordnen Sie jede Zeile in umgekehrter Reihenfolge der Zahlen in der dritten Spalte an (Hinweis: Ordnen Sie den Inhalt jeder Zeile neu an, ohne ihn zu ändern). Verwenden Sie den Befehl sort zur Bestätigung (dieses Problem muss nicht mit dem Ergebnis der Ausführung des Befehls übereinstimmen).
Ich habe die Funktion "sort_values" von "pandas" verwendet.
Python-Teil
import pandas as pd
df = pd.read_table('hightemp.txt', header=None, usecols=[0])
print(df.sort_values(2, ascending=False))
Ergebnis der Terminalausgabe
0 1 2 3
0 Präfektur Kochi Egawasaki 41.0 2013-08-12
2 Tajimi, Präfektur Gifu 40.9 2007-08-16
1 Kumagai 40, Präfektur Saitama.9 2007-08-16
Unterlassung
21 Präfektur Yamanashi Otsuki 39.9 1990-07-19
22 Tsuruoka, Präfektur Yamagata 39.9 1978-08-03
23 Nagoya, Aichi 39.9 1942-08-02
Bash Teil
sort hightemp.txt -k 3 -n -r
Ergebnis der Terminalausgabe
Präfektur Kochi Egawasaki 41 2013-08-12
40 Tajimi, Präfektur Gifu.9 2007-08-16
40 Kumagai, Präfektur Saitama.9 2007-08-16
Unterlassung
Toyonaka 39, Osaka.9 1994-08-08
39 Hatoyama, Präfektur Saitama.9 1997-07-05
39 Shigehara, Chiba.9 2013-08-11
Ermitteln Sie die Häufigkeit des Auftretens der ersten Spalte jeder Zeile und zeigen Sie sie in absteigender Reihenfolge an. Verwenden Sie zur Bestätigung die Befehle cut, uniq und sort.
Ich habe die Funktion value_counts
von pandas
verwendet.
Python-Teil
import pandas as pd
df = pd.read_table('hightemp.txt', header=None, usecols=[0])
print(df[0].value_counts(ascending=False))
Ergebnis der Terminalausgabe
Präfektur Saitama 3
Präfektur Yamanashi 3
Präfektur Yamagata 3
Unterlassung
Präfektur Ehime 1
Präfektur Kochi 1
Präfektur Osaka 1
Bash Teil
cut -f 1 hightemp.txt | sort | uniq -c | sort -r
Ergebnis der Terminalausgabe
3 Präfektur Gunma
3 Präfektur Yamanashi
3 Präfektur Yamagata
Unterlassung
1 Präfektur Ehime
1 Präfektur Osaka
1 Präfektur Wakayama