言語処理100本ノック 2020 (Rev 2)を解いてみる ~第2章: UNIXコマンド~

popular-names.txtは,アメリカで生まれた赤ちゃんの「名前」「性別」「人数」「年」をタブ区切り形式で格納したファイルである.以下の処理を行うプログラムを作成し,popular-names.txtを入力ファイルとして実行せよ.さらに,同様の処理をUNIXコマンドでも実行し,プログラムの実行結果を確認せよ.

プログラムを作成し、Unixコマンドの実行結果と突合。
UnixコマンドについてはWSL(Ubuntu)をインストールした環境で確認。

10. 行数のカウント

行数をカウントせよ.確認にはwcコマンドを用いよ.

考え方
open()でファイルオープンし、読み込みを以下のいずれかで実施。
read():ファイル内容をすべて読み込み、1つの文字列として返す
readline():ファイルから1行ずつ読み出し、文字列を返す
readlines():ファイル内容をすべて読み込み、各行を要素とするリストを返
今回はlen()でリストの要素数を取得できそうなのでreadlines()を使用。

コード(Python)

file = open('popular-names.txt','r')
lines = file.readlines()
file.close()
print(len(lines))

コード(UNIXコマンド)

wc -l popular-names.txt


実行結果

2780

11. タブをスペースに置換

タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.

考え方
ファイルの読み込みは前問と同様。
読み込み後の置換処理をreplace()で実施。(置換前に\t、置換後に" "を指定。)
replace(<置換前>,<置換後>,<回数>)
なおsedコマンドの使い方は下記の通り。
sed s/置換対象文字列/置換後文字列/g ファイル名

コード(Python)

file = open('popular-names.txt','r')
lines = file.readlines()
file.close()

New_lines = []
for line in lines:
    New_lines.append(line.replace("\t"," "))    

print("置換前")
print(lines)

print("置換後")
print(New_lines)

コード(UNIXコマンド)

sed s/$'\t'/' '/g popular-names.txt > new_text.txt

# 結果確認
diff -y  popular-names.txt new_text.txt

実行結果(Python)

置換前
['Mary\tF\t7065\t1880\n', 'Anna\tF\t2604\t1880\n', 'Emma\tF\t2003\t1880\n', 'Elizabeth\tF\t1939\t1880\n', 'Minnie\tF\t1746\t1880\n', 'Margaret\tF\t1578\t1880\n', 'Ida\tF\t1472\t1880\n', 'Alice\tF\t1414\t1880\n', 'Bertha\tF\t1320\t1880\n', 'Sarah\tF\t1288\t1880\n', 'John\tM\t9655\t1880\n', 'William\tM\t9532\t1880\n', 'James\tM\t5927\t1880\n', 'Charles\tM\t5348\t1880\n', 'George\tM\t5126\t1880\n', 'Frank\tM\t3242\t1880\n', 'Joseph\tM\t2632\t1880\n', 'Thomas\tM\t2534\t1880\n', 'Henry\tM\t2444\t1880\n', 'Robert\tM\t2415\t1880\n', 'Mary\tF\t6919\t1881\n', 'Anna\tF\t2698\t1881\n', 'Emma\tF\t2034\t1881\n', 'Elizabeth\tF\t1852\t1881\n', 'Margaret\tF\t1658\t1881\n', 'Minnie\tF\t1653\t1881\n', 'Ida\tF\t1439\t1881\n', 'Annie\tF\t1326\t1881\n', 'Bertha\tF\t1324\t1881\n', 'Alice\tF\t1308\t1881\n', 'John\tM\t8769\t1881\n', 'William\tM\t8524\t1881\n', 'James\tM\t5441\t1881\n', 'George\tM\t4664\t1881\n', 'Charles\tM\t4636\t1881\n', 'Frank\tM\t2834\t1881\n', 'Joseph\tM\t2456\t1881\n', 'Henry\tM\t2339\t1881\n', 'Thomas\tM\t2282\t1881\n', 'Edward\tM\t2177\t1881\n', 'Mary\tF\t8148\t1882\n', 'Anna\tF\t3143\t1882\n', 'Emma\tF\t2303\t1882\n', 'Elizabeth\tF\t2186\t1882\n', 'Minnie\tF\t2004\t1882\n', 'Margaret\tF\t1821\t1882\n', 'Ida\tF\t1673\t1882\n', 'Alice\tF\t1542\t1882\n', 'Bertha\tF\t1508\t1882\n', 'Annie\tF\t1492\t1882\n', 'John\tM\t9557\t1882\n', 'William\tM\t9298\t1882\n', 'James\tM\t5892\t1882\n', 'George\tM\t5193\t1882\n', 'Charles\tM\t5091\t1882\n', 'Frank\tM\t3176\t1882\n', 'Joseph\tM\t2670\t1882\n', 'Thomas\tM\t2610\t1882\n', 'Henry\tM\t2579\t1882\n', 'Robert\tM\t2500\t1882\n', 'Mary\tF\t8012\t1883\n', 'Anna\tF\t3306\t1883\n', 'Emma\tF\t2367\t1883\n', 'Elizabeth\tF\t2255\t1883\n', 'Minnie\tF\t2035\t1883\n', 'Margaret\tF\t1881\t1883\n', 'Bertha\tF\t1681\t1883\n', 'Ida\tF\t1634\t1883\n', 'Annie\tF\t1589\t1883\n', 'Clara\tF\t1548\t1883\n', 'John\tM\t8894\t1883\n', 'William\tM\t8387\t1883\n', 'James\tM\t5223\t1883\n', 'Charles\tM\t4826\t1883\n', 'George\tM\t4736\t1883\n', 'Frank\tM\t2986\t1883\n', 'Joseph\tM\t2515\t1883\n', 'Henry\tM\t2383\t1883\n', 'Robert\tM\t2334\t1883\n', 'Thomas\tM\t2316\t1883\n', 'Mary\tF\t9217\t1884\n', 'Anna\tF\t3860\t1884\n', 'Emma\tF\t2587\t1884\n', 'Elizabeth\tF\t2549\t1884\n', 'Minnie\tF\t2243\t1884\n', 'Margaret\tF\t2142\t1884\n', 'Ida\tF\t1882\t1884\n', 'Clara\tF\t1852\t1884\n', 'Bertha\tF\t1789\t1884\n', 'Annie\tF\t1739\t1884\n', 'John\tM\t9388\t1884\n', 'William\tM\t8897\t1884\n', 'James\tM\t5693\t1884\n', 'George\tM\t4961\t1884\n', 'Charles\tM\t4802\t1884\n', 'Frank\tM\t3218\t1884\n', 'Joseph\tM\t2707\t1884\n', 'Thomas\tM\t2572\t1884\n', 'Henry\tM\t2474\t1884\n', 'Robert\tM\t2468\t1884\n', 'Mary\tF\t9128\t1885\n', 'Anna\tF\t3994\t1885\n', 'Emma\tF\t2728\t1885\n', 'Elizabeth\tF\t2582\t1885\n', 'Margaret\tF\t2204\t1885\n', 'Minnie\tF\t2178\t1885\n', 'Clara\tF\t1910\t1885\n', 'Bertha\tF\t1860\t1885\n', 'Ida\tF\t1854\t1885\n', 'Annie\tF\t1703\t1885\n', 'John\tM\t8756\t1885\n', 'William\tM\t8044\t1885\n', 'James\tM\t5175\t1885\n', 'George\tM\t4674\t1885\n', 'Charles\tM\t4599\t1885\n', 'Frank\tM\t3067\t1885\n', 'Joseph\tM\t2540\t1885\n', 'Henry\tM\t2406\t1885\n', 'Robert\tM\t2322\t1885\n', 'Thomas\tM\t2266\t1885\n', 'Mary\tF\t9889\t1886\n', 'Anna\tF\t4283\t1886\n', 'Emma\tF\t2764\t1886\n', 'Elizabeth\tF\t2680\t1886\n', 'Minnie\tF\t2372\t1886\n', 'Margaret\tF\t2275\t1886\n', 'Ida\tF\t2049\t1886\n', 'Bertha\tF\t2001\t1886\n', 'Clara\tF\t1916\t1886\n', 'Florence\tF\t1860\t1886\n', 'John\tM\t9026\t1886\n', 'William\tM\t8252\t1886\n', 'James\tM\t5355\t1886\n', 'George\tM\t4671\t1886\n', 'Charles\tM\t4533\t1886\n', 'Frank\tM\t3127\t1886\n', 'Joseph\tM\t2594\t1886\n', 'Robert\tM\t2443\t1886\n', 'Henry\tM\t2404\t1886\n', 'Thomas\tM\t2337\t1886\n', 'Mary\tF\t9888\t1887\n', 'Anna\tF\t4227\t1887\n', 'Elizabeth\tF\t2681\t1887\n', 'Emma\tF\t2647\t1887\n', 'Margaret\tF\t2419\t1887\n', 'Minnie\tF\t2215\t1887\n', 'Bertha\tF\t2037\t1887\n', 'Clara\tF\t1984\t1887\n', 'Florence\tF\t1964\t1887\n', 'Ida\tF\t1929\t1887\n', 'John\tM\t8110\t1887\n', 'William\tM\t7470\t1887\n', 'James\tM\t4768\t1887\n', 'George\tM\t4284\t1887\n', 'Charles\tM\t4031\t1887\n', 'Frank\tM\t2883\t1887\n', 'Joseph\tM\t2456\t1887\n', 'Henry\tM\t2228\t1887\n', 'Thomas\tM\t2151\t1887\n', 'Edward\tM\t2125\t1887\n', 'Mary\tF\t11754\t1888\n', 'Anna\tF\t4982\t1888\n', 'Elizabeth\tF\t3224\t1888\n', 'Emma\tF\t3087\t1888\n', 'Margaret\tF\t2904\t1888\n', 'Minnie\tF\t2654\t1888\n', 'Bertha\tF\t2450\t1888\n', 'Florence\tF\t2444\t1888\n', 'Ethel\tF\t2374\t1888\n', 'Bessie\tF\t2278\t1888\n', 'John\tM\t9247\t1888\n', 'William\tM\t8705\t1888\n', 'James\tM\t5562\t1888\n', 'George\tM\t4912\t1888\n', 'Charles\tM\t4591\t1888\n', 'Frank\tM\t3459\t1888\n', 'Joseph\tM\t2993\t1888\n', 'Robert\tM\t2814\t1888\n', 'Harry\tM\t2759\t1888\n', 'Henry\tM\t2596\t1888\n', 'Mary\tF\t11648\t1889\n', 'Anna\tF\t5062\t1889\n', 'Elizabeth\tF\t3058\t1889\n', 'Margaret\tF\t2917\t1889\n', 'Emma\tF\t2884\t1889\n', 'Minnie\tF\t2624\t1889\n', 'Florence\tF\t2465\t1889\n', 'Ethel\tF\t2463\t1889\n', 'Bessie\tF\t2343\t1889\n', 'Clara\tF\t2319\t1889\n', 'John\tM\t8548\t1889\n', 'William\tM\t7772\t1889\n', 'James\tM\t5020\t1889\n', 'George\tM\t4430\t1889\n', 'Charles\tM\t4199\t1889\n', 'Frank\tM\t2975\t1889\n', 'Joseph\tM\t2729\t1889\n', 'Harry\tM\t2559\t1889\n', 'Robert\tM\t2513\t1889\n', 'Edward\tM\t2299\t1889\n', 'Mary\tF\t12078\t1890\n', 'Anna\tF\t5233\t1890\n', 'Elizabeth\tF\t3112\t1890\n', 'Margaret\tF\t3100\t1890\n', 'Emma\tF\t2980\t1890\n', 'Florence\tF\t2744\t1890\n', 'Ethel\tF\t2718\t1890\n', 'Minnie\tF\t2650\t1890\n', 'Clara\tF\t2496\t1890\n', 'Bertha\tF\t2388\t1890\n', 'John\tM\t8502\t1890\n', 'William\tM\t7494\t1890\n', 'James\tM\t5097\t1890\n', 'George\tM\t4458\t1890\n', 'Charles\tM\t4061\t1890\n', 'Frank\tM\t3078\t1890\n', 'Joseph\tM\t2670\t1890\n', 'Robert\tM\t2541\t1890\n', 'Henry\tM\t2349\t1890\n', 'Harry\tM\t2345\t1890\n', 'Mary\tF\t11703\t1891\n', 'Anna\tF\t5099\t1891\n', 'Margaret\tF\t3065\t1891\n', 'Elizabeth\tF\t3059\t1891\n', 'Emma\tF\t2884\t1891\n', 'Florence\tF\t2715\t1891\n', 'Ethel\tF\t2689\t1891\n', 'Minnie\tF\t2428\t1891\n', 'Helen\tF\t2417\t1891\n', 'Bertha\tF\t2372\t1891\n', 'John\tM\t7680\t1891\n', 'William\tM\t6763\t1891\n', 'James\tM\t4516\t1891\n', 'George\tM\t3931\t1891\n', 'Charles\tM\t3640\t1891\n', 'Frank\tM\t2652\t1891\n', 'Joseph\tM\t2572\t1891\n', 'Robert\tM\t2240\t1891\n', 'Harry\tM\t2132\t1891\n', 'Henry\tM\t2049\t1891\n', 'Mary\tF\t13172\t1892\n', 'Anna\tF\t5542\t1892\n', 'Elizabeth\tF\t3461\t1892\n', 'Margaret\tF\t3435\t1892\n', 'Ruth\tF\t3290\t1892\n', 'Florence\tF\t3154\t1892\n', 'Emma\tF\t3128\t1892\n', 'Ethel\tF\t3035\t1892\n', 'Helen\tF\t2936\t1892\n', 'Clara\tF\t2661\t1892\n', 'John\tM\t9039\t1892\n', 'William\tM\t7782\t1892\n', 'James\tM\t5398\t1892\n', 'George\tM\t4760\t1892\n', 'Charles\tM\t4319\t1892\n', 'Frank\tM\t3150\t1892\n', 'Joseph\tM\t3064\t1892\n', 'Robert\tM\t2710\t1892\n', 'Harry\tM\t2460\t1892\n', 'Henry\tM\t2452\t1892\n', 'Mary\tF\t12784\t1893\n', 'Anna\tF\t5695\t1893\n', 'Ruth\tF\t3658\t1893\n', 'Margaret\tF\t3565\t1893\n', 'Elizabeth\tF\t3360\t1893\n', 'Helen\tF\t3249\t1893\n', 'Florence\tF\t3231\t1893\n', 'Ethel\tF\t3119\t1893\n', 'Emma\tF\t2968\t1893\n', 'Bertha\tF\t2623\t1893\n', 'John\tM\t8049\t1893\n', 'William\tM\t7223\t1893\n', 'James\tM\t5030\t1893\n', 'George\tM\t4320\t1893\n', 'Charles\tM\t3723\t1893\n', 'Joseph\tM\t2997\t1893\n', 'Frank\tM\t2917\t1893\n', 'Robert\tM\t2563\t1893\n', 'Edward\tM\t2309\t1893\n', 'Harry\tM\t2245\t1893\n', 'Mary\tF\t13151\t1894\n', 'Anna\tF\t5565\t1894\n', 'Margaret\tF\t3700\t1894\n', 'Helen\tF\t3676\t1894\n', 'Elizabeth\tF\t3425\t1894\n', 'Ruth\tF\t3372\t1894\n', 'Ethel\tF\t3287\t1894\n', 'Florence\tF\t3233\t1894\n', 'Emma\tF\t2937\t1894\n', 'Marie\tF\t2649\t1894\n', 'John\tM\t8238\t1894\n', 'William\tM\t7274\t1894\n', 'James\tM\t5110\t1894\n', 'George\tM\t4365\t1894\n', 'Charles\tM\t3788\t1894\n', 'Joseph\tM\t2977\t1894\n', 'Frank\tM\t2863\t1894\n', 'Robert\tM\t2497\t1894\n', 'Henry\tM\t2278\t1894\n', 'Harry\tM\t2189\t1894\n', 'Mary\tF\t13446\t1895\n', 'Anna\tF\t5950\t1895\n', 'Helen\tF\t4023\t1895\n', 'Margaret\tF\t3931\t1895\n', 'Elizabeth\tF\t3603\t1895\n', 'Ruth\tF\t3551\t1895\n', 'Florence\tF\t3471\t1895\n', 'Ethel\tF\t3391\t1895\n', 'Marie\tF\t3011\t1895\n', 'Emma\tF\t2952\t1895\n', 'John\tM\t8320\t1895\n', 'William\tM\t7277\t1895\n', 'James\tM\t5335\t1895\n', 'George\tM\t4289\t1895\n', 'Charles\tM\t3633\t1895\n', 'Frank\tM\t3012\t1895\n', 'Joseph\tM\t2992\t1895\n', 'Robert\tM\t2635\t1895\n', 'Henry\tM\t2221\t1895\n', 'Edward\tM\t2203\t1895\n', 'Mary\tF\t13811\t1896\n', 'Anna\tF\t5860\t1896\n', 'Helen\tF\t4392\t1896\n', 'Margaret\tF\t4050\t1896\n', 'Ruth\tF\t3905\t1896\n', 'Ethel\tF\t3502\t1896\n', 'Elizabeth\tF\t3471\t1896\n', 'Florence\tF\t3323\t1896\n', 'Marie\tF\t3087\t1896\n', 'Emma\tF\t2872\t1896\n', 'John\tM\t8138\t1896\n', 'William\tM\t7747\t1896\n', 'James\tM\t5207\t1896\n', 'George\tM\t4286\t1896\n', 'Charles\tM\t3639\t1896\n', 'Joseph\tM\t3051\t1896\n', 'Frank\tM\t2845\t1896\n', 'Robert\tM\t2719\t1896\n', 'Edward\tM\t2296\t1896\n', 'Henry\tM\t2183\t1896\n', 'Mary\tF\t13413\t1897\n', 'Anna\tF\t5429\t1897\n', 'Helen\tF\t4519\t1897\n', 'Margaret\tF\t4146\t1897\n', 'Ruth\tF\t3878\t1897\n', 'Elizabeth\tF\t3442\t1897\n', 'Florence\tF\t3369\t1897\n', 'Ethel\tF\t3182\t1897\n', 'Marie\tF\t3078\t1897\n', 'Emma\tF\t2698\t1897\n', 'John\tM\t7550\t1897\n', 'William\tM\t7198\t1897\n', 'James\tM\t5113\t1897\n', 'George\tM\t4078\t1897\n', 'Charles\tM\t3341\t1897\n', 'Joseph\tM\t2827\t1897\n', 'Frank\tM\t2726\t1897\n', 'Robert\tM\t2701\t1897\n', 'Edward\tM\t2121\t1897\n', 'Henry\tM\t1994\t1897\n', 'Mary\tF\t14406\t1898\n', 'Anna\tF\t5773\t1898\n', 'He
置換後
['Mary F 7065 1880\n', 'Anna F 2604 1880\n', 'Emma F 2003 1880\n', 'Elizabeth F 1939 1880\n', 'Minnie F 1746 1880\n', 'Margaret F 1578 1880\n', 'Ida F 1472 1880\n', 'Alice F 1414 1880\n', 'Bertha F 1320 1880\n', 'Sarah F 1288 1880\n', 'John M 9655 1880\n', 'William M 9532 1880\n', 'James M 5927 1880\n', 'Charles M 5348 1880\n', 'George M 5126 1880\n', 'Frank M 3242 1880\n', 'Joseph M 2632 1880\n', 'Thomas M 2534 1880\n', 'Henry M 2444 1880\n', 'Robert M 2415 1880\n', 'Mary F 6919 1881\n', 'Anna F 2698 1881\n', 'Emma F 2034 1881\n', 'Elizabeth F 1852 1881\n', 'Margaret F 1658 1881\n', 'Minnie F 1653 1881\n', 'Ida F 1439 1881\n', 'Annie F 1326 1881\n', 'Bertha F 1324 1881\n', 'Alice F 1308 1881\n', 'John M 8769 1881\n', 'William M 8524 1881\n', 'James M 5441 1881\n', 'George M 4664 1881\n', 'Charles M 4636 1881\n', 'Frank M 2834 1881\n', 'Joseph M 2456 1881\n', 'Henry M 2339 1881\n', 'Thomas M 2282 1881\n', 'Edward M 2177 1881\n', 'Mary F 8148 1882\n', 'Anna F 3143 1882\n', 'Emma F 2303 1882\n', 'Elizabeth F 2186 1882\n', 'Minnie F 2004 1882\n', 'Margaret F 1821 1882\n', 'Ida F 1673 1882\n', 'Alice F 1542 1882\n', 'Bertha F 1508 1882\n', 'Annie F 1492 1882\n', 'John M 9557 1882\n', 'William M 9298 1882\n', 'James M 5892 1882\n', 'George M 5193 1882\n', 'Charles M 5091 1882\n', 'Frank M 3176 1882\n', 'Joseph M 2670 1882\n', 'Thomas M 2610 1882\n', 'Henry M 2579 1882\n', 'Robert M 2500 1882\n', 'Mary F 8012 1883\n', 'Anna F 3306 1883\n', 'Emma F 2367 1883\n', 'Elizabeth F 2255 1883\n', 'Minnie F 2035 1883\n', 'Margaret F 1881 1883\n', 'Bertha F 1681 1883\n', 'Ida F 1634 1883\n', 'Annie F 1589 1883\n', 'Clara F 1548 1883\n', 'John M 8894 1883\n', 'William M 8387 1883\n', 'James M 5223 1883\n', 'Charles M 4826 1883\n', 'George M 4736 1883\n', 'Frank M 2986 1883\n', 'Joseph M 2515 1883\n', 'Henry M 2383 1883\n', 'Robert M 2334 1883\n', 'Thomas M 2316 1883\n', 'Mary F 9217 1884\n', 'Anna F 3860 1884\n', 'Emma F 2587 1884\n', 'Elizabeth F 2549 1884\n', 'Minnie F 2243 1884\n', 'Margaret F 2142 1884\n', 'Ida F 1882 1884\n', 'Clara F 1852 1884\n', 'Bertha F 1789 1884\n', 'Annie F 1739 1884\n', 'John M 9388 1884\n', 'William M 8897 1884\n', 'James M 5693 1884\n', 'George M 4961 1884\n', 'Charles M 4802 1884\n', 'Frank M 3218 1884\n', 'Joseph M 2707 1884\n', 'Thomas M 2572 1884\n', 'Henry M 2474 1884\n', 'Robert M 2468 1884\n', 'Mary F 9128 1885\n', 'Anna F 3994 1885\n', 'Emma F 2728 1885\n', 'Elizabeth F 2582 1885\n', 'Margaret F 2204 1885\n', 'Minnie F 2178 1885\n', 'Clara F 1910 1885\n', 'Bertha F 1860 1885\n', 'Ida F 1854 1885\n', 'Annie F 1703 1885\n', 'John M 8756 1885\n', 'William M 8044 1885\n', 'James M 5175 1885\n', 'George M 4674 1885\n', 'Charles M 4599 1885\n', 'Frank M 3067 1885\n', 'Joseph M 2540 1885\n', 'Henry M 2406 1885\n', 'Robert M 2322 1885\n', 'Thomas M 2266 1885\n', 'Mary F 9889 1886\n', 'Anna F 4283 1886\n', 'Emma F 2764 1886\n', 'Elizabeth F 2680 1886\n', 'Minnie F 2372 1886\n', 'Margaret F 2275 1886\n', 'Ida F 2049 1886\n', 'Bertha F 2001 1886\n', 'Clara F 1916 1886\n', 'Florence F 1860 1886\n', 'John M 9026 1886\n', 'William M 8252 1886\n', 'James M 5355 1886\n', 'George M 4671 1886\n', 'Charles M 4533 1886\n', 'Frank M 3127 1886\n', 'Joseph M 2594 1886\n', 'Robert M 2443 1886\n', 'Henry M 2404 1886\n', 'Thomas M 2337 1886\n', 'Mary F 9888 1887\n', 'Anna F 4227 1887\n', 'Elizabeth F 2681 1887\n', 'Emma F 2647 1887\n', 'Margaret F 2419 1887\n', 'Minnie F 2215 1887\n', 'Bertha F 2037 1887\n', 'Clara F 1984 1887\n', 'Florence F 1964 1887\n', 'Ida F 1929 1887\n', 'John M 8110 1887\n', 'William M 7470 1887\n', 'James M 4768 1887\n', 'George M 4284 1887\n', 'Charles M 4031 1887\n', 'Frank M 2883 1887\n', 'Joseph M 2456 1887\n', 'Henry M 2228 1887\n', 'Thomas M 2151 1887\n', 'Edward M 2125 1887\n', 'Mary F 11754 1888\n', 'Anna F 4982 1888\n', 'Elizabeth F 3224 1888\n', 'Emma F 3087 1888\n', 'Margaret F 2904 1888\n', 'Minnie F 2654 1888\n', 'Bertha F 2450 1888\n', 'Florence F 2444 1888\n', 'Ethel F 2374 1888\n', 'Bessie F 2278 1888\n', 'John M 9247 1888\n', 'William M 8705 1888\n', 'James M 5562 1888\n', 'George M 4912 1888\n', 'Charles M 4591 1888\n', 'Frank M 3459 1888\n', 'Joseph M 2993 1888\n', 'Robert M 2814 1888\n', 'Harry M 2759 1888\n', 'Henry M 2596 1888\n', 'Mary F 11648 1889\n', 'Anna F 5062 1889\n', 'Elizabeth F 3058 1889\n', 'Margaret F 2917 1889\n', 'Emma F 2884 1889\n', 'Minnie F 2624 1889\n', 'Florence F 2465 1889\n', 'Ethel F 2463 1889\n', 'Bessie F 2343 1889\n', 'Clara F 2319 1889\n', 'John M 8548 1889\n', 'William M 7772 1889\n', 'James M 5020 1889\n', 'George M 4430 1889\n', 'Charles M 4199 1889\n', 'Frank M 2975 1889\n', 'Joseph M 2729 1889\n', 'Harry M 2559 1889\n', 'Robert M 2513 1889\n', 'Edward M 2299 1889\n', 'Mary F 12078 1890\n', 'Anna F 5233 1890\n', 'Elizabeth F 3112 1890\n', 'Margaret F 3100 1890\n', 'Emma F 2980 1890\n', 'Florence F 2744 1890\n', 'Ethel F 2718 1890\n', 'Minnie F 2650 1890\n', 'Clara F 2496 1890\n', 'Bertha F 2388 1890\n', 'John M 8502 1890\n', 'William M 7494 1890\n', 'James M 5097 1890\n', 'George M 4458 1890\n', 'Charles M 4061 1890\n', 'Frank M 3078 1890\n', 'Joseph M 2670 1890\n', 'Robert M 2541 1890\n', 'Henry M 2349 1890\n', 'Harry M 2345 1890\n', 'Mary F 11703 1891\n', 'Anna F 5099 1891\n', 'Margaret F 3065 1891\n', 'Elizabeth F 3059 1891\n', 'Emma F 2884 1891\n', 'Florence F 2715 1891\n', 'Ethel F 2689 1891\n', 'Minnie F 2428 1891\n', 'Helen F 2417 1891\n', 'Bertha F 2372 1891\n', 'John M 7680 1891\n', 'William M 6763 1891\n', 'James M 4516 1891\n', 'George M 3931 1891\n', 'Charles M 3640 1891\n', 'Frank M 2652 1891\n', 'Joseph M 2572 1891\n', 'Robert M 2240 1891\n', 'Harry M 2132 1891\n', 'Henry M 2049 1891\n', 'Mary F 13172 1892\n', 'Anna F 5542 1892\n', 'Elizabeth F 3461 1892\n', 'Margaret F 3435 1892\n', 'Ruth F 3290 1892\n', 'Florence F 3154 1892\n', 'Emma F 3128 1892\n', 'Ethel F 3035 1892\n', 'Helen F 2936 1892\n', 'Clara F 2661 1892\n', 'John M 9039 1892\n', 'William M 7782 1892\n', 'James M 5398 1892\n', 'George M 4760 1892\n', 'Charles M 4319 1892\n', 'Frank M 3150 1892\n', 'Joseph M 3064 1892\n', 'Robert M 2710 1892\n', 'Harry M 2460 1892\n', 'Henry M 2452 1892\n', 'Mary F 12784 1893\n', 'Anna F 5695 1893\n', 'Ruth F 3658 1893\n', 'Margaret F 3565 1893\n', 'Elizabeth F 3360 1893\n', 'Helen F 3249 1893\n', 'Florence F 3231 1893\n', 'Ethel F 3119 1893\n', 'Emma F 2968 1893\n', 'Bertha F 2623 1893\n', 'John M 8049 1893\n', 'William M 7223 1893\n', 'James M 5030 1893\n', 'George M 4320 1893\n', 'Charles M 3723 1893\n', 'Joseph M 2997 1893\n', 'Frank M 2917 1893\n', 'Robert M 2563 1893\n', 'Edward M 2309 1893\n', 'Harry M 2245 1893\n', 'Mary F 13151 1894\n', 'Anna F 5565 1894\n', 'Margaret F 3700 1894\n', 'Helen F 3676 1894\n', 'Elizabeth F 3425 1894\n', 'Ruth F 3372 1894\n', 'Ethel F 3287 1894\n', 'Florence F 3233 1894\n', 'Emma F 2937 1894\n', 'Marie F 2649 1894\n', 'John M 8238 1894\n', 'William M 7274 1894\n', 'James M 5110 1894\n', 'George M 4365 1894\n', 'Charles M 3788 1894\n', 'Joseph M 2977 1894\n', 'Frank M 2863 1894\n', 'Robert M 2497 1894\n', 'Henry M 2278 1894\n', 'Harry M 2189 1894\n', 'Mary F 13446 1895\n', 'Anna F 5950 1895\n', 'Helen F 4023 1895\n', 'Margaret F 3931 1895\n', 'Elizabeth F 3603 1895\n', 'Ruth F 3551 1895\n', 'Florence F 3471 1895\n', 'Ethel F 3391 1895\n', 'Marie F 3011 1895\n', 'Emma F 2952 1895\n', 'John M 8320 1895\n', 'William M 7277 1895\n', 'James M 5335 1895\n', 'George M 4289 1895\n', 'Charles M 3633 1895\n', 'Frank M 3012 1895\n', 'Joseph M 2992 1895\n', 'Robert M 2635 1895\n', 'Henry M 2221 1895\n', 'Edward M 2203 1895\n', 'Mary F 13811 1896\n', 'Anna F 5860 1896\n', 'Helen F 4392 1896\n', 'Margaret F 4050 1896\n', 'Ruth F 3905 1896\n', 'Ethel F 3502 1896\n', 'Elizabeth F 3471 1896\n', 'Florence F 3323 1896\n', 'Marie F 3087 1896\n', 'Emma F 2872 1896\n', 'John M 8138 1896\n', 'William M 7747 1896\n', 'James M 5207 1896\n', 'George M 4286 1896\n', 'Charles M 3639 1896\n', 'Joseph M 3051 1896\n', 'Frank M 2845 1896\n', 'Robert M 2719 1896\n', 'Edward M 2296 1896\n', 'Henry M 2183 1896\n', 'Mary F 13413 1897\n', 'Anna F 5429 1897\n', 'Helen F 4519 1897\n', 'Margaret F 4146 1897\n', 'Ruth F 3878 1897\n', 'Elizabeth F 3442 1897\n', 'Florence F 3369 1897\n', 'Ethel F 3182 1897\n', 'Marie F 3078 1897\n', 'Emma F 2698 1897\n', 'John M 7550 1897\n', 'William M 7198 1897\n', 'James M 5113 1897\n', 'George M 4078 1897\n', 'Charles M 3341 1897\n', 'Joseph M 2827 1897\n', 'Frank M 2726 1897\n', 'Robert M 2701 1897\n', 'Edward M 2121 1897\n', 'Henry M 1994 1897\n', 'Mary F 14406 1898\n', 'Anna F 5773 1898\n', 'Helen F 5230 1898\n', 'Margaret F 4696 1898\n

実行結果(UNIX)

Mary    F       7065    1880                                  | Mary F 7065 1880
Anna    F       2604    1880                                  | Anna F 2604 1880
Emma    F       2003    1880                                  | Emma F 2003 1880
Elizabeth       F       1939    1880                          | Elizabeth F 1939 1880
Minnie  F       1746    1880                                  | Minnie F 1746 1880
Margaret        F       1578    1880                          | Margaret F 1578 1880
Ida     F       1472    1880                                  | Ida F 1472 1880
Alice   F       1414    1880                                  | Alice F 1414 1880
Bertha  F       1320    1880                                  | Bertha F 1320 1880
Sarah   F       1288    1880                                  | Sarah F 1288 1880
John    M       9655    1880                                  | John M 9655 1880
William M       9532    1880                                  | William M 9532 1880
James   M       5927    1880                                  | James M 5927 1880
Charles M       5348    1880                                  | Charles M 5348 1880
George  M       5126    1880                                  | George M 5126 18805 1880\n', 'Anna F 2604 1880\n', 'Emma F 2003 1880\n', 'Elizabeth F 1939 1880\n', 
 
~以下略~

12. 1列目をcol1.txtに,2列目をcol2.txtに保存

各行の1列目だけを抜き出したものをcol1.txtに,2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.確認にはcutコマンドを用いよ.

考え方
pandasを使わない場合と使う場合でそれぞれ検討。
①使わない場合
 for文で行を取り出し、split()でカラムに分割。(templistに一旦格納。)
 所定のカラムをcol1[]、col2[]にそれぞれ格納し、ファイルに書き込み。
②使う場合
 read_csv()でファイルを読み込む。
 df.iloc[:,0]、df.iloc[:,1]で1列目/2列目を選択し、to_csvでファイルに書き込み。

コード(Python)① pandas使わない場合

# ファイル読み込み
file = open('popular-names.txt','r')
lines = file.readlines()
file.close()

# 1列目、2列目抽出
col1 = []
col2 = []
for line in lines:
    templist = (line.split("\t"))    
    col1.append(templist[0])
    col2.append(templist[1])
    
# ファイル書き込み
file = open('col1.txt','w')
file.write("\n".join(col1))
file.close()

file = open('col2.txt','w')
file.write("\n".join(col2))
file.close()

コード(Python)② pandas使う場合

import pandas as pd

df = pd.read_csv('popular-names.txt', delimiter='\t', header=None)
df.iloc[:,0].to_csv('col1_pd.txt', header=False, index=False)
df.iloc[:,1].to_csv('col2_pd.txt', header=False, index=False)

コード(UNIXコマンド)

cut -f1 -d $'\t' ./popular-names.txt > ./col1.txt
cut -f2 -d $'\t' ./popular-names.txt > ./col2.txt

結果 ※エディタで表示
col1.txt

Mary
Anna
Emma
Elizabeth
Minnie
Margaret
Ida
Alice
Bertha
Sarah
John
William
 
~以下略~

col2.txt

F
F
F
F
F
F
F
F
F
F
 
~以下略~

13. col1.txtとcol2.txtをマージ

12で作ったcol1.txtとcol2.txtを結合し,元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.確認にはpasteコマンドを用いよ.

考え方
前問と同様pandas有り無しそれぞれについて検討。
①使わない場合
 for文で各ファイルの要素を取り出し、+演算子を利用して結合。
 rstrip()を使用しているのは、readlines()の仕様で、要素の末尾に改行コードがついており、そのまま結合できないため。
②使う場合
 pandasの関数pd.concat().to_csv()で結合&書き込み。

コード(Python)① pandas使わない場合

# ファイル読み込み
file1 = open('col1.txt','r')
col1 = file1.readlines()
file1.close()
file2 = open('col2.txt','r')
col2 = file2.readlines()
file2.close()

# 1列目、2列目結合
New_lines = []
for i in range(0,min(len(col1),len(col2))):
    line1 = col1[i].rstrip()
    line2 = col2[i].rstrip()
    New_lines.append(line1 + '\t' + line2)
    
# ファイル書き込み
file = open('col12.txt','w')
file.write('\n'.join(New_lines))
file.close()

コード(Python)② pandas使う

import pandas as pd

df = pd.read_csv('popular-names.txt', delimiter='\t', header=None)
df.iloc[:,0].to_csv('col1_pd.txt', header=False, index=False)
df.iloc[:,1].to_csv('col2_pd.txt', header=False, index=False)

コード(UNIXコマンド)

paste col1.txt col2.txt > col12.txt

結果 ※エディタで表示

Mary	F
Anna	F
Emma	F
Elizabeth	F
Minnie	F
Margaret	F
Ida	F
Alice	F
Bertha	F
Sarah	F
 
~以下略~

14. 先頭からN行を出力

自然数Nをコマンドライン引数などの手段で受け取り,入力のうち先頭のN行だけを表示せよ.確認にはheadコマンドを用いよ.

考え方
 input関数で行数をターミナルから受け取り、受け取った数だけforループを回してファイルの内容を出力させるように実装。
(入力された値が自然数かの判定は未実装。)

コード(Python)

N = int(input('表示させたい行数を入力してください:'))
file = open('popular-names.txt','r')
lines = file.readlines()
file.close()

for i in range(0,N):
    print(lines[i].rstrip())

コード(UNIXコマンド)

head -10 popular-names.txt

実行結果

表示させたい行数を入力してください:10
Mary    F       7065    1880
Anna    F       2604    1880
Emma    F       2003    1880
Elizabeth       F       1939    1880
Minnie  F       1746    1880
Margaret        F       1578    1880
Ida     F       1472    1880
Alice   F       1414    1880
Bertha  F       1320    1880
Sarah   F       1288    1880

15. 末尾のN行を出力

自然数Nをコマンドライン引数などの手段で受け取り,入力のうち末尾のN行だけを表示せよ.確認にはtailコマンドを用いよ.

考え方
 前問とほぼ同様。ファイル行数の末尾からN行を出力させるため、
 「ファイル行数-N+i」に変更。

コード(Python)

N = int(input('表示させたい行数を入力してください:'))
file = open('popular-names.txt','r')
lines = file.readlines()
file.close()

for i in range(0,N):
    print(lines[len(lines)-N+i].rstrip())

コード(UNIXコマンド)

 tail -10 popular-names.txt

実行結果

表示させたい行数を入力してください:10
Liam    M       19837   2018
Noah    M       18267   2018
William M       14516   2018
James   M       13525   2018
Oliver  M       13389   2018
Benjamin        M       13381   2018
Elijah  M       12886   2018
Lucas   M       12585   2018
Mason   M       12435   2018
Logan   M       12352   2018

16. ファイルをN分割する

自然数Nをコマンドライン引数などの手段で受け取り,入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.

考え方

下記のロジックで実装。
①引数(分割数)と元ファイル行数から1分割ファイルあたりの行数を算出
②ファイル数分forループを回し、ループ内で下記の通り実施
 ②-1オフセット(取り出す要素の初期値)の計算
 ②-2初期値~初期値+行数の分だけ要素を取り出し
 ②-3要素を結合し、ファイル出力

ポイントとしては②-3の出力ファイル名で変数iを利用している点と、
joinの際に.strip()を付与している点。(これを記述しないと改行が2重に入り、分割ファイルの末尾が空行になってしまうため)

コード(Python)

N = int(input('ファイルの分割数を入力してください:'))
file = open('popular-names.txt','r')
lines = file.readlines()
file.close()

# 1ファイルあたりの行数を計算
linesize = round(len(lines) / N)

for i in range(0,N):
    # 範囲指定のためのオフセットを計算
    offset = i*linesize
    # 該当範囲の要素をlineに格納
    line = lines[offset:offset+linesize]
    
    #ファイル出力 
    file = open('output_{:02d}.txt'.format(i),'w')
    file.write(''.join(line).strip())
    file.close()

コード(UNIXコマンド)

split -n 10 popular-names.txt

実行結果

ファイルの分割数を入力してください:10
 
>dir 
2022/07/24  03:09             5,467 output_00.txt
2022/07/24  03:09             5,508 output_01.txt
2022/07/24  03:09             5,726 output_02.txt
2022/07/24  03:09             5,842 output_03.txt
2022/07/24  03:09             5,807 output_04.txt
2022/07/24  03:09             5,758 output_05.txt
2022/07/24  03:09             5,862 output_06.txt
2022/07/24  03:09             5,994 output_07.txt
2022/07/24  03:09             6,006 output_08.txt
2022/07/24  03:09             5,816 output_09.txt

17. 1列目の文字列の異なり

1列目の文字列の種類(異なる文字列の集合)を求めよ.確認にはcut, sort, uniqコマンドを用いよ.

考え方

下記のロジックで実装。
①ファイル読み込み&1列目の抽出
 →No.12の問題と同様。
②重複排除、ソート
 →set()でリストの重複を排除、sorted()でアルファベット順に並べ替え。

コード(Python)

# ファイル読み込み
file = open('popular-names.txt','r')
lines = file.readlines()
file.close()

# 1列目抽出
col1 = []
for line in lines:
    templist = (line.split("\t"))    
    col1.append(templist[0])

print('\n'.join(sorted(set(col1))))

コード(UNIXコマンド)

cut -f 1  popular-names.txt | sort | uniq

実行結果

Abigail
Aiden
Alexander
Alexis
Alice

~省略~

Tracy
Tyler
Virginia
Walter
William

18. 各行を3コラム目の数値の降順にソート

各行を3コラム目の数値の逆順で整列せよ(注意: 各行の内容は変更せずに並び替えよ).確認にはsortコマンドを用いよ(この問題はコマンドで実行した時の結果と合わなくてもよい).

考え方

カラム間の対応は崩さずに並び替えが必要なので、
lambda式とsort関数の組み合わせで実装することとした。 
ポイントとしては下記の通り。

・末尾の改行コードを削除する部分
ファイル読み込みの際、入力データの最終行の改行コードだけ含まれておらず、最終的な結果が崩れてしまうといった問題が発生したため、あらかじめ改行コードをすべて削除してから処理をさせることとした。

・指定列で逆順ソートする部分
 3カラム目の値をキーとするため、key=lambda x: int(x[2])とした。
 またint()としているのは数値として比較を行わせるため。

コード(Python)

# 元データを2次元配列に格納
file = open('popular-names.txt','r')
lines = file.readlines()
file.close()

# 末尾の改行コードを削除(終行に改行コードがない場合、結果が崩れてしまう問題に対する措置)
lines = list(map(lambda x: x.strip(), lines))

# 行をタブで分割(for文で1行ずつ取得し、splitを実行しているのと等価)
lines = list(map(lambda line: line.split('\t'), lines))

# 指定列で逆順ソート(3カラム目をint型で取り出したものをキーに降順で並び替え)
lines = sorted(lines, key=lambda x: int(x[2]), reverse=True)

# タブ区切りで行を結合
lines = list(map(lambda x: "\t".join(x), lines))

# ファイル書き込み
file = open('2-18_out.txt','w')
file.write('\n'.join(lines))
file.close()

コード(UNIXコマンド)

 sort -k 3 -n -r ./popular-names.txt

実行結果 ※出力ファイルの内容を表示

Linda	F	99689	1947
Linda	F	96211	1948
James	M	94757	1947
Michael	M	92704	1957
Robert	M	91640	1947
Linda	F	91016	1949
Michael	M	90656	1956
Michael	M	90517	1958
 
~省略~
 
Bertha	F	1508	1882
Annie	F	1492	1882
Ida	F	1472	1880
Ida	F	1439	1881
Alice	F	1414	1880
Annie	F	1326	1881
Bertha	F	1324	1881
Bertha	F	1320	1880
Alice	F	1308	1881
Sarah	F	1288	1880  ← 2780行目


19. 各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる

各行の1列目の文字列の出現頻度を求め,その高い順に並べて表示せよ.確認にはcut, uniq, sortコマンドを用いよ.

考え方
 collections.Counter()を使うことで実装。
 上記関数に1カラム目のリストを渡すことで出現頻度の集計結果が辞書型のオブジェクトとして取得される。

コード(Python)

import collections

file = open('popular-names.txt','r')
lines = file.readlines()
file.close()

# 末尾の改行コードを削除(最終行に改行コードがない場合、結果が崩れてしまう問題に対する措置)
lines = list(map(lambda x: x.strip(), lines))

# 行をタブで分割(for文で1行ずつ取得し、splitを実行しているのと等価)
lines = list(map(lambda line: line.split('\t'), lines))

# 1カラム目を取得
col1 = list(map(lambda x: x[0],lines))

# 数をカウント
counter = collections.Counter(col1)

# 結果表示
print(counter)

コード(UNIXコマンド)

cut -f 1  popular-names.txt | sort | uniq -c | sort -n -r

実行結果

Counter({'James': 118, 'William': 111, 'John': 108, 'Robert': 108, 'Mary': 92, 'Charles': 75, 'Michael': 74, 'Elizabeth': 73, 'Joseph': 70, 'Margaret': 60, 'George': 58, 'Thomas': 58, 'David': 57, 'Richard': 51, 'Helen': 45, 'Frank': 43, 'Christopher': 43, 'Anna': 41, 'Edward': 40, 'Ruth': 39, 'Patricia': 38, 'Matthew': 37, 'Dorothy': 36, 'Emma': 35, 'Barbara': 32, 'Daniel': 31, 'Joshua': 31, 'Sarah': 26, 'Linda': 26, 'Jennifer': 26, 'Emily': 26, 'Jessica': 25, 'Jacob': 25, 'Mildred': 24, 'Betty': 24, 'Susan': 24, 'Henry': 23, 'Ashley': 23, 'Nancy': 22, 'Andrew': 21, 'Florence': 20, 'Marie': 20, 'Donald': 20, 'Amanda': 20, 'Samantha': 19, 'Karen': 18, 'Lisa': 18, 'Melissa': 18, 'Madison': 18, 'Olivia': 18, 'Stephanie': 17, 'Abigail': 17, 'Ethel': 16, 'Sandra': 16, 'Mark': 16, 'Frances': 15, 'Carol': 15, 'Angela': 15, 'Michelle': 15, 'Heather': 15, 'Ethan': 15, 'Isabella': 15, 'Shirley': 14, 'Kimberly': 14, 'Amy': 14, 'Ava': 14, 'Virginia': 13, 'Deborah': 13, 'Brian': 13, 'Jason': 13, 'Nicole': 13, 'Hannah': 13, 'Sophia': 13, 'Minnie': 12, 'Bertha': 12, 'Donna': 12, 'Cynthia': 11, 'Alice': 10, 'Doris': 10, 'Ronald': 10, 'Brittany': 10, 'Nicholas': 10, 'Mia': 10, 'Noah': 10, 'Joan': 9, 'Debra': 9, 'Tyler': 9, 'Ida': 8, 'Clara': 8, 'Judith': 8, 'Taylor': 8, 'Alexis': 8, 'Alexander': 8, 'Mason': 8, 'Harry': 7, 'Sharon': 7, 'Steven': 7, 'Tammy': 7, 'Brandon': 7, 'Liam': 7, 'Anthony': 6, 'Annie': 5, 'Gary': 5, 'Jeffrey': 5, 'Jayden': 5, 'Charlotte': 5, 'Lillian': 4, 'Kathleen': 4, 'Justin': 4, 'Austin': 4, 'Chloe': 4, 'Benjamin': 4, 'Evelyn': 3, 'Megan': 3, 'Aiden': 3, 'Harper': 3, 'Elijah': 3, 'Bessie': 2, 'Larry': 2, 'Rebecca': 2, 'Lauren': 2, 'Amelia': 2, 'Logan': 2, 'Oliver': 2, 'Walter': 1, 'Carolyn': 1, 'Pamela': 1, 'Lori': 1, 'Laura': 1, 'Tracy': 1, 'Julie': 1, 'Scott': 1, 'Kelly': 1, 'Crystal': 1, 'Rachel': 1, 'Lucas': 1})

極力pandasを使わずに解答を考えてみましたが、処理が複雑になるとしんどそうなので、次以降の問題は素直にpandas使いたいと思います。

この記事が気に入ったらサポートをしてみませんか?