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.
Omettre les paramètres d'importation et d'analyse arg. Si le nombre de lignes M du fichier n'est pas exactement divisible par le nombre naturel donné N C'est une spécification qui donne une ligne de plus dans l'ordre à partir de la première partie divisée.
knock016.py
args = parser.parse_args()
N = args.line
filename = args.filename
#Afficher les N dernières lignes
f = open(filename)
lines = f.readlines()
M = len(lines)
#Marchandise et reste
quotient = M/N
remainder = M - quotient*N
#Trouvez la ligne qui sépare le fichier
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()
Commande UNIX ... Le code est devenu plus long après l'ajout de la validation facultative (mais pas assez).
knock016.sh
#!/bin/sh
#Recevez le nombre naturel N par des moyens tels que des 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.
# 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
#Si le reste est 0, il sera dans un fichier$Fractionner pour inclure les lignes de quotient
split -l $quotient $INPUT_FILE SPLITHEAD_PREFIX
else
#Si le reste est différent de 0
# (a)Depuis le début(($quotient + 1) * $remainder)Ligne et(b)Après cela, divisez-le en 2 fichiers
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)Dans un fichier($quotient+1)ligne,(b)Dans un fichier$quotientligne,含まれるように分割する
split -l `expr \( $quotient + 1 \)` $TMP_HEAD $SPLITHEAD_PREFIX
split -l $quotient $TMP_TAIL $SPLITTAIL_PREFIX
rm -iv split/tmp*
fi
Puisque split est une commande utilisée en spécifiant le nombre de lignes contenues dans un fichier, Impression qu'il fallait un peu d'ingéniosité.
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.
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éfecture d'Aichi
#Préfecture de Yamagata
#Préfecture de Gifu
#Préfecture de Chiba
#Saitama
#Préfecture de Kochi
#Préfecture de Gunma
#Préfecture de Yamanashi
#Préfecture de Wakayama
#Préfecture d'Ehime
#Préfecture d'Osaka
#Préfecture de Shizuoka
Commande UNIX. Dois-je faire la même commande ...?
python
awk -F'\t' '{print $1;}' hightemp.txt | sort | uniq
#>>>
#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 les 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).
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éfecture de Kochi Egawasaki 41 2013-08-12
#40 Kumagai, Préfecture de Saitama.9 2007-08-16
#Préfecture de Gifu Tajimi 40.9 2007-08-16
#Yamagata 40 Yamagata.8 1933-07-25
#Préfecture de Yamanashi Kofu 40.7 2013-08-10
#Préfecture de Wakayama Katsuragi 40.6 1994-08-08
#Préfecture de Shizuoka Tenryu 40.6 1994-08-04
#40 Katsunuma, préfecture de Yamanashi.5 2013-08-10
#40 Koshiya, Préfecture de Saitama.4 2007-08-16
#Préfecture de Gunma Tatebayashi 40.3 2007-08-16
#Préfecture de Gunma Kamisatomi 40.3 1998-07-04
#Ainishi 40, Préfecture d'Aichi.3 1994-08-05
#Préfecture de Chiba Ushihisa 40.2 2004-07-20
#Préfecture de Shizuoka Sakuma 40.2 2001-07-24
#40 Uwajima, Préfecture d'Ehime.2 1927-07-22
#40 Sakata, Préfecture de Yamagata.1 1978-08-03
#Mino 40, préfecture de Gifu 2007-08-16
#Préfecture de Gunma Maebashi 40 2001-07-24
#39 Shigehara, Chiba.9 2013-08-11
#39 Hatoyama, Préfecture de Saitama.9 1997-07-05
#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
Commande UNIX.
python
sort -k3r hightemp.txt
Spécifiez une colonne avec l'option k. Ajoutez r et inversez l'ordre.
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.
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éfecture de Yamagata 3
#Préfecture de Saitama 3
#Préfecture de Gunma 3
#Préfecture de Yamanashi 3
#Préfecture d'Aichi 2
#Préfecture de Gifu 2
#Préfecture de Chiba 2
#Préfecture de Shizuoka 2
#Préfecture de Kochi 1
#Préfecture de Wakayama 1
#Préfecture d'Ehime 1
#Préfecture d'Osaka 1
#Préfecture de Yamagata 3
#Préfecture de Saitama 3
#Préfecture de Gunma 3
#Préfecture de Yamanashi 3
#Préfecture d'Aichi 2
#Préfecture de Gifu 2
#Préfecture de Chiba 2
#Préfecture de Shizuoka 2
#Préfecture de Kochi 1
#Préfecture de Wakayama 1
#Préfecture d'Ehime 1
#Préfecture d'Osaka 1
S'il faut compter avec le type defaultdict comme dans (1) Comme dans (2), utilisez-vous le compteur lui-même? Il existe une méthode most_common () ...
Puis commande UNIX.
python
cut -f 1 hightemp.txt | sort | uniq -c | sort -nr
#>>>
#3 Préfecture de Gunma
#3 Préfecture de Yamanashi
#3 Préfecture de Yamagata
#3 Préfecture de Saitama
#2 Préfecture de Shizuoka
#2 Préfecture d'Aichi
#2 Préfecture de Gifu
#2 Chiba
#1 Préfecture de Kochi
#1 Préfecture d'Ehime
#1 Préfecture d'Osaka
#1 Préfecture de Wakayama
C'est une commande idiomatique que j'utilise souvent, donc je veux bien m'en souvenir. Trier par tri, et s'il y a la même chose dans la ligne adjacente avec uniq, mettez-la ensemble, Utilisez l'option -c pour compter ces lignes en double Triez les lignes sous forme de nombres (par ordre décroissant) avec "sort -nr".
Recommended Posts