読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】sort したら 10 が 9 より前に来た。sort・uniq・cut・paste・tr【LPICレベル1】

16レスカテゴリ:Linux
1: 名無しさん

数字の一覧を sort したら 10、100、9、9 の順になった
数字の順にならへんの?

2: 名無しさん

前提のおさらい。head・tail は先頭と末尾、wc は「行数 単語数 バイト数」を出す。パイプでつないで使う

3: 名無しさん

>>1
sort は既定では文字として比べるから、1文字目の 1 が 9 より小さくて 10 が先に来る。数として比べるなら -n
sort -n → 9、9、10、100
sort -nr → 100、10、9、9(-r で逆順)

4: 名無しさん

>>3
ほかのオプション
-u 重複を1つに
-t : 区切り文字
-k 3 3番目の欄で並べる(-k 3,3 でその欄だけ)
-f 大文字小文字を区別しない

5: 名無しさん

>>4
user1:x:1001:sales みたいな行で試した
sort -t: -k3 -n → 1000、1001、1002 の順
sort -t: -k4,4 -k3,3nr → 4欄目で並べて、同じものの中は3欄目の数の大きい順

6: 名無しさん

>>3
並び順はロケールでも変わる。sort の man に「LC_ALL=C にするとバイトの値の昔ながらの順になる」と書いてある

7: 名無しさん

uniq で重複を消したのに、まだ同じ行が残ってる

8: 名無しさん

>>7
uniq は隣り合った同じ行しかまとめない。apple・apple・banana・apple を uniq -c すると 2 apple、1 banana、1 apple になる。先に sort する

9: 名無しさん

>>8
sort f | uniq -c → 3 apple、1 banana。-d は重複した行だけ、-u は1回だけの行だけ

10: 名無しさん

>>1
列を取り出すのは?

11: 名無しさん

>>10
cut。-d で区切り、-f で欄、-c で文字の位置
cut -d: -f1,3 p → user1:1001
cut -c1-5 p → user1
区切りを指定しないとタブ区切り

12: 名無しさん

>>11
逆にくっつけるのが paste。2つのファイルの行を横に並べる(既定はタブ)
paste c1 c2 → a(タブ)1、b(タブ)2
paste -d, c1 c2 → a,1、b,2
paste -s c1 → 1つのファイルの行を横1行に

13: 名無しさん

>>1
tr は?

14: 名無しさん

>>13
文字の置き換え・削除・まとめ。標準入力しか読まないから、ファイル名を渡すと extra operand で怒られる
tr a-z A-Z 小文字を大文字に
tr -d 0-9 数字を消す
tr -s , 続いた , を1つに

15: 名無しさん

>>14
tr a-z A-Z < file か cat file | tr … で渡すんやな

16: 名無しさん

>>8
数字は sort -n、uniq の前に sort、tr は標準入力だけ。3つともひっかけで出そう

管理人のひとこと