Q1uniqが重複として扱うのはどの行ですか?
整形ツール — sort / uniq / cut / wc / tr / tee
sort -nの並べ替え、sort | uniq -cの重複と出現回数、cut -d',' -f1の列抽出、wc -lの行数、tr 'a-z' 'A-Z' の文字変換、teeの画面とファイル分岐を、1 コマンドずつ図解と端末で実習します。
行を並べ替える — sort
本記事では、テキストを整形・集計する 6 つのコマンド sort / uniq / cut / wc / tr / tee を 1 コマンドずつ実習します。最初はsortです。sortは入力の行を辞書順(文字の並び順)に並べ替えます。数値を大小で並べたいときはsort -n、降順にしたいときはsort -rを使います。辞書順では10が2より前に来る(先頭の文字1と2を比較する)ため、数値の並べ替えには-nが必要です。
| 書き方 | 意味 |
|---|---|
sort | 行を辞書順に並べ替える |
sort -n | 行を数値の大小で並べ替える |
sort -r | 並び順を逆(降順)にする |
10が2より前に来ます。数値順は-nを付けます。printf 'cherry\napple\nbanana\n' > words.txt # 3 行の素材を作成
sort words.txt # apple banana cherry(辞書順)
sort -r words.txt # cherry banana apple(降順)
printf '100\n9\n25\n' > scores.txt # 数値の素材を作成
sort scores.txt # 100 25 9(辞書順なので 1 が先頭)
sort -n scores.txt # 9 25 100(数値順)
重複をまとめる — uniq
uniqは隣り合って並んだ同じ行を 1 つにまとめるコマンドです。離れた場所にある重複は見ないため、ふつうはsortで同じ行を隣へ揃えてからパイプで渡します。uniq -cを付けると、各行の前に出現回数が付き、種類別の件数集計になります。
| 書き方 | 意味 |
|---|---|
uniq | 隣接する同じ行を 1 つにまとめる |
sort file.txt | uniq | 並べ替えてから渡し、離れた重複もまとめる |
uniq -c | 各行の前に出現回数を付ける |
uniqは隣接重複だけ見るので、先にsortで同じ行を隣へ揃えます。printf 'banana\napple\nbanana\napple\n' > items.txt # 4 行の素材を作成
sort items.txt # apple apple banana banana
sort items.txt | uniq # apple banana(重複を除去)
sort items.txt | uniq -c # 2 apple / 2 banana(出現回数)
列を取り出す — cut
cutは各行を区切り文字で分け、指定した列だけを取り出します。-dの後ろに区切り文字、-fの後ろに列番号を書き、cut -d',' -f1なら CSV の 1 列目を抜き出せます。複数列なら-f1,3のようにカンマで並べます。CSV やコロン区切りの設定ファイルから必要な列だけを取り出すときに使います。
| 書き方 | 意味 |
|---|---|
cut -d',' -f1 | カンマ区切りの 1 列目を抽出する |
cut -d':' -f1 | :区切りの 1 列目を抽出する |
cut -d',' -f1,3 | 1 列目と 3 列目をまとめて抽出する |
-dの区切り文字で行を分割し、-fの番号の列だけが出力されます。printf 'root:x:0\nuser:x:1000\n' > passwd.txt # コロン区切りの素材を作成
cut -d':' -f1 passwd.txt # 1 列目(名前)だけ
cut -d':' -f1,3 passwd.txt # 1 と 3 列目
行・単語・バイトを数える — wc
wcは入力の行数・単語数・バイト数を数えるコマンドです。オプション無しでは 3 つの数字が並び、wc -lで行数だけ、wc -wで単語数だけ、wc -cでバイト数だけが出ます。いちばん使うのはwc -lで、ls | wc -lのようにパイプで受ければ「ファイルが何個あるか」「該当行が何件か」を数えられます。
| 書き方 | 意味 |
|---|---|
wc | 行数・単語数・バイト数を並べて表示する |
wc -l | 行数だけを表示する |
wc -w | 単語数だけを表示する |
wc -c | バイト数だけを表示する |
printf 'one two three\nfour\n' > draft.txt # 2 行・4 単語の素材を作成
wc draft.txt # 行数・単語数・バイト数が並ぶ
wc -l draft.txt # 2(行数だけ)
ls | wc -l # パイプで受けてファイル数を数える
文字を変換する — tr
trは標準入力の文字を文字単位で別の文字に置き換えるコマンドです。tr 'a-z' 'A-Z'は小文字を大文字へ変換します。tr -sは連続した同じ文字を 1 つにまとめ(スペースの連続を 1 つにするなど)、tr -dは指定した文字を削除します。trはファイル名を引数に取らず、パイプや入力リダイレクトから受け取ります。
| 書き方 | 意味 |
|---|---|
tr 'a-z' 'A-Z' | 小文字を大文字へ変換する |
tr -s ' ' | 連続した文字を 1 つにまとめる |
tr -d 'x' | 指定した文字を削除する |
-s)・削除(-d)です。echo 'hello linux' | tr 'a-z' 'A-Z' # HELLO LINUX
echo 'a b c' | tr -s ' ' # 連続スペースを 1 つに -> a b c
echo 'a-b-c' | tr -d '-' # - を削除 -> abc
画面とファイルへ分岐する — tee
teeはパイプで受け取った内容を画面に出しつつ、同時にファイルにも書き込みます。途中経過をログに残しながら、後続のコマンドにもそのまま流したいときに使います。コマンド | tee out.txt | 次のコマンドのようにつなぐと、out.txtに記録しながら処理を続けられます。既存のファイルに追記したいときはtee -aを使います。
| 書き方 | 意味 |
|---|---|
tee out.txt | 画面とファイルの両方へ出力する(上書き) |
tee -a out.txt | 画面に出しつつファイルへ追記する |
teeは受け取った内容を画面に出しつつファイルにも書き、あとからcatで確認できます。ls | tee list.txt # 一覧を画面に出しつつ list.txt へ保存
cat list.txt # ファイルにも残っている
echo 'extra' | tee -a list.txt # -a は上書きせず追記
理解度チェック
まずは1問ずつ答えてみましょう。
Q2cut -d',' -f1 users.csvは何を出力しますか?
Q3echo hi | tee out.txtを実行すると何が起きますか?