Empfangen Sie die natürliche Zahl N mithilfe von Befehlszeilenargumenten und teilen Sie die Eingabedatei zeilenweise in N. Erzielen Sie die gleiche Verarbeitung mit dem Befehl split.
Import- und Argparse-Einstellungen weglassen. Wenn die Anzahl der Zeilen M in der Datei nicht genau durch die gegebene natürliche Zahl N teilbar ist Es ist eine Spezifikation, die eine weitere Zeile in der Reihenfolge vom ersten geteilten Teil gibt.
knock016.py
args = parser.parse_args()
N = args.line
filename = args.filename
#Letzte N Zeilen anzeigen
f = open(filename)
lines = f.readlines()
M = len(lines)
#Waren und Rest
quotient = M/N
remainder = M - quotient*N
#Suchen Sie die Zeile, die die Datei teilt
num_of_lines = [quotient+1 if i < remainder else quotient for i in xrange(N)]
num_of_lines_cumulative = [sum(num_of_lines[:i+1]) for i in xrange(N)]
for i, line in enumerate(lines):
if i in num_of_lines_cumulative:
print
print line.strip()
else:
print line.strip()
f.close()
UNIX-Befehl ... Der Code wurde mit optionaler Validierung länger (obwohl nicht genug).
knock016.sh
#!/bin/sh
#Empfangen Sie die natürliche Zahl N mithilfe von Befehlszeilenargumenten und teilen Sie die Eingabedatei zeilenweise in N.
#Erzielen Sie die gleiche Verarbeitung mit dem Befehl split.
# ex.
# sh knock016.sh -f hightemp.txt -n 7
while getopts f:n: OPT
do
case $OPT in
"f" ) FLG_F="TRUE" ; INPUT_FILE=$OPTARG ;;
"n" ) FLG_N="TRUE" ; N=$OPTARG ;;
* ) echo "Usage: $CMDNAME [-f file name] [-n split number]" 1>&2
exit 1 ;;
esac
done
if [ ! "$FLG_F" = "TRUE" ]; then
echo 'file name is not set.'
exit 1
fi
if [ ! "$FLG_N" = "TRUE" ]; then
echo 'split number is not set.'
exit 1
fi
#INPUT_FILE="hightemp.txt"
TMP_HEAD="split/tmphead.$INPUT_FILE"
TMP_TAIL="split/tmptail.$INPUT_FILE"
SPLITHEAD_PREFIX="split/splithead."
SPLITTAIL_PREFIX="split/splittail."
M=$( wc -l < $INPUT_FILE )
#N=9
quotient=`expr \( $M / $N \)`
remainder=`expr \( $M - $quotient \* $N \)`
if [ $quotient -eq 0 ]; then
echo "cannot divide: N is larger than the lines of the input file."
exit 0
fi
if [ $remainder -eq 0 ]; then
#Wenn der Rest 0 ist, befindet er sich in einer Datei$Aufteilen, um Quotientenlinien einzuschließen
split -l $quotient $INPUT_FILE SPLITHEAD_PREFIX
else
#Wenn der Rest nicht 0 ist
# (a)Von Anfang an(($quotient + 1) * $remainder)Linie und(b)Teilen Sie es danach in 2 Dateien auf
split_head=`expr \( \( $quotient + 1 \) \* $remainder \)`
split_tail=`expr \( $M - $split_head \)`
head -n $split_head $INPUT_FILE > $TMP_HEAD
tail -n $split_tail $INPUT_FILE > $TMP_TAIL
# (a)In einer Datei($quotient+1)Linie,(b)In einer Datei$quotientLinie,含まれるように分割する
split -l `expr \( $quotient + 1 \)` $TMP_HEAD $SPLITHEAD_PREFIX
split -l $quotient $TMP_TAIL $SPLITTAIL_PREFIX
rm -iv split/tmp*
fi
Da split ein Befehl ist, der durch Angabe der Anzahl der in einer Datei enthaltenen Zeilen verwendet wird, Eindruck, dass ein wenig Einfallsreichtum nötig war.
Suchen Sie den Typ der Zeichenfolge in der ersten Spalte (eine Reihe verschiedener Zeichenfolgen). Verwenden Sie zur Bestätigung die Befehle sort und uniq.
python
if __name__ == '__main__':
f = open(filename)
lines = f.readlines()
# unlike problem 12., "+ '\n'" is not necessary
content_col1 = [line.split()[0] for line in lines]
content_col1_set = set(content_col1)
print len(content_col1_set)
for x in content_col1_set:
print x
f.close()
#>>>
#12
#Präfektur Aichi
#Präfektur Yamagata
#Präfektur Gifu
#Präfektur Chiba
#Saitama
#Präfektur Kochi
#Präfektur Gunma
#Präfektur Yamanashi
#Präfektur Wakayama
#Präfektur Ehime
#Präfektur Osaka
#Präfektur Shizuoka
UNIX-Befehl. Muss ich die gleiche Bestellung machen ...?
python
awk -F'\t' '{print $1;}' hightemp.txt | sort | uniq
#>>>
#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).
python
if __name__ == '__main__':
f = open(filename)
lines = f.readlines()
# reverse=True allows us to perform descending sort
sorted_lines = sorted(lines, key=lambda line: float(line.split()[2]), reverse=True)
for sorted_line in sorted_lines:
print sorted_line,
f.close()
#>>>
#Präfektur Kochi Egawasaki 41 2013-08-12
#40 Kumagai, Präfektur Saitama.9 2007-08-16
#Präfektur Gifu Tajimi 40.9 2007-08-16
#Yamagata 40 Yamagata.8 1933-07-25
#Präfektur Yamanashi Kofu 40.7 2013-08-10
#Präfektur Wakayama Katsuragi 40.6 1994-08-08
#Präfektur Shizuoka Tenryu 40.6 1994-08-04
#40 Katsunuma, Präfektur Yamanashi.5 2013-08-10
#40 Koshiya, Präfektur Saitama.4 2007-08-16
#Präfektur Gunma Tatebayashi 40.3 2007-08-16
#Präfektur Gunma Kamisatomi 40.3 1998-07-04
#Ainishi 40, Präfektur Aichi.3 1994-08-05
#Präfektur Chiba Ushihisa 40.2 2004-07-20
#Präfektur Shizuoka Sakuma 40.2 2001-07-24
#40 Uwajima, Präfektur Ehime.2 1927-07-22
#40 Sakata, Präfektur Yamagata.1 1978-08-03
#Mino 40, Präfektur Gifu 2007-08-16
#Präfektur Gunma Maebashi 40 2001-07-24
#39 Shigehara, Chiba.9 2013-08-11
#39 Hatoyama, Präfektur Saitama.9 1997-07-05
#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
UNIX-Befehl.
python
sort -k3r hightemp.txt
Geben Sie eine Spalte mit der Option k an. Fügen Sie r hinzu und kehren Sie die Reihenfolge um.
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.
python
from collections import defaultdict
from collections import Counter
...
if __name__ == '__main__':
f = open(filename)
lines = f.readlines()
# extract 1st column
content_col1 = [line.split()[0] for line in lines]
# (1) defaultdict
# http://docs.python.jp/2/library/collections.html#collections.defaultdict
d = defaultdict(int)
for col1 in content_col1:
d[col1] += 1
for word, cnt in sorted(d.items(), key=lambda x: x[1], reverse=True):
print word, cnt
print
# (2) Counter
# http://docs.python.jp/2/library/collections.html#collections.Counter
counter = Counter(content_col1)
for word, cnt in counter.most_common():
print word, cnt
f.close()
#>>>
#Präfektur Yamagata 3
#Präfektur Saitama 3
#Präfektur Gunma 3
#Präfektur Yamanashi 3
#Präfektur Aichi 2
#Präfektur Gifu 2
#Präfektur Chiba 2
#Präfektur Shizuoka 2
#Präfektur Kochi 1
#Präfektur Wakayama 1
#Präfektur Ehime 1
#Präfektur Osaka 1
#Präfektur Yamagata 3
#Präfektur Saitama 3
#Präfektur Gunma 3
#Präfektur Yamanashi 3
#Präfektur Aichi 2
#Präfektur Gifu 2
#Präfektur Chiba 2
#Präfektur Shizuoka 2
#Präfektur Kochi 1
#Präfektur Wakayama 1
#Präfektur Ehime 1
#Präfektur Osaka 1
Gibt an, ob mit dem Standarddiktortyp wie in (1) gezählt werden soll. Verwenden Sie wie in (2) den Zähler selbst? Es gibt eine most_common () -Methode ...
Dann UNIX-Befehl.
python
cut -f 1 hightemp.txt | sort | uniq -c | sort -nr
#>>>
#3 Präfektur Gunma
#3 Präfektur Yamanashi
#3 Präfektur Yamagata
#3 Präfektur Saitama
#2 Präfektur Shizuoka
#2 Präfektur Aichi
#2 Präfektur Gifu
#2 Chiba
#1 Präfektur Kochi
#1 Präfektur Ehime
#1 Präfektur Osaka
#1 Präfektur Wakayama
Es ist ein idiomartiger Befehl, den ich oft benutze, deshalb möchte ich mich gut daran erinnern. Sortieren Sie nach Sortierung, und wenn in der nebenstehenden Zeile mit uniq dasselbe steht, setzen Sie es zusammen. Verwenden Sie die Option -c, um solche doppelten Zeilen zu zählen Sortieren Sie die Zeilen als Zahlen (in absteigender Reihenfolge) mit "sort -nr".
Recommended Posts