ファイルのソートとマージ--sort,cut,trなどのコマンドアプリケーション


この文章の内容はテキストのみを編集しますが、結果として元のファイルの内容は変更されません.
sortコマンドは、ファイルランキングをソートするだけです
オプションの意味
-cテストファイルがソートされているか
-kソートする領域を指定する(共通)
-mソートされた2つのファイルをマージ
-n数値サイズによるソート(共通)
-o出力を指定ファイルに書き込み、リダイレクト出力ファイルに相当
-rソート結果を逆表示
-t領域区切り記号の変更(共通)
-u除去結果の重複行
フォーマット:sortオプション入力ファイルsortオプション入力ファイル
以下、詳しく説明します.
-tオプション――原理は第1領域から並べ替え、第1領域の内容が同じであれば第2領域で並べ替える
-k
[root@localhost ~]# cat abc
aa:ff:kk
bb:qq:gg
dd:ee:ww
xx cc
[root@localhost ~]# sort -t: -k3 abc
xx cc
bb:qq:gg
aa:ff:kk
dd:ee:ww

3番目の領域からソートが開始され、最初の2つの領域はソートされず、-tは次のように区切ります.
sort-t:-k 3/etc/passwdも使えます
[root@localhost ~]# sort -t: -k3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
squid:x:23:23::/var/spool/squid:/sbin/nologin

これにより、第3領域はUIDで並べ替えられますが、ここでは最初の文字サイズのみで並べ替えられ、全体のサイズで並べ替えられないことがわかります.
たとえば、このようにして1番目の文字のみをソートし、数全体をソートするわけではありません.
1 1
400 400
67 501
89 602
501 67
602 89
-nオプションは、指定した列の数値サイズで、全体的な性質に属してソートされます.
次のようになります.
900 3
60 60
3 100
100 900
[root@localhost ~]# cat abc
900:aa
60:bb
3:rr
100:pp
[root@localhost ~]# sort -t: -k1 abc
100:pp
3:rr
60:bb
900:aa
[root@localhost ~]# sort -t: -k1n abc
3:rr
60:bb
100:pp
900:aa

-nを加算すると全体のソートであり、-nを加算しないと単一の文字でソートされることがわかります.
だからsort-t:-k 3 n/etc/passwdでUIDを小さいから大きいまで並べ替えることができます
-rは逆方向で、大きいから小さいまで並べ替えます
[root@localhost ~]# cat abc
900:aa
60:bb
3:rr
100:pp
[root@localhost ~]# sort -t: -k1nr abc
900:aa
100:pp
60:bb
3:rr

-uオプション、重複する領域を除去
[root@localhost ~]# cat abc
900:aa
900:aa
900:aa
60:bb
[root@localhost ~]# sort -t: -k1n -u abc
60:bb
900:aa

そのうち2行の900:aaを繰り返すと表示されません
-oは指向性出力ですが、直接>で代用すればいいので、このオプションはあまり使いません.
-mは、2つのファイルの内容が重複していないことを前提として、ソート後の2つのファイルをマージします.
[root@localhost ~]# cat abc
555:rr
900:aa
60:bb
[root@localhost ~]# cat aaa
xxx
xxxxx
[root@localhost ~]# sort -t: -m abc aaa
555:rr
900:aa
60:bb
xxx
xxxxx

これでabcの内容を全部aaaに入れました
実はsort-t:abc aaaと略記すればいいのです
2ファイルの領域で並べ替えることもできます
[root@localhost ~]# cat abc
555:rr
900:aa
60:bb
[root@localhost ~]# cat aaa
777:xxx
444444:xxxxx
[root@localhost ~]# sort -t: -k1n abc aaa
60:bb
555:rr
777:xxx
900:aa
444444:xxxxx

これで2つのファイルの内容が統合されてからエリアソートが行われます
sortコマンドはここに紹介します
Uniqコマンド――重複行を除去するために使用されますが、sort-uとはあまり差がありません
オプションの意味
-c 1行ごとにテキストに繰り返される回数を印刷する
-dは重複したレコードのみを表示し、各重複したレコードは1回のみ表示される
-u重複していないレコードのみ表示
[root@localhost ~]# cat abc
555:rr
555:rr
555:rr
60:bb
[root@localhost ~]# uniq abc
555:rr
60:bb

2行の重複除外
sort-uとの違い、sort-uは重複行を1つ削除するだけです
[root@localhost ~]# cat abc
555:rr
555:rr
555:rr
60:bb
60:bb
show me
555:rr
hello
[root@localhost ~]# sort -u abc
555:rr
60:bb
hello
show me
[root@localhost ~]# uniq abc
555:rr
60:bb
show me
555:rr
hello

uniqは連続して繰り返される行を削除するだけであり,4行目の555:rrは削除されていないがsort-uはいずれも重複していると考えられるので一括して削除する
-Cは、印刷テキストに重複が発生した回数
[root@localhost ~]# uniq -c abc
      3 555:rr
      2 60:bb
      1 show me
      1 555:rr
      1 hello

繰り返しの回数を表示できます
-d連続重複記録のみ印刷
[root@localhost ~]# cat abc
555:rr
555:rr
555:rr
60:bb
60:bb
show me
555:rr
hello
[root@localhost ~]# uniq -d abc
555:rr
60:bb

連続して繰り返されるローレコードのみを表示
-u連続重複のないレコードのみ印刷
[root@localhost ~]# cat abc
555:rr
555:rr
555:rr
60:bb
60:bb
show me
555:rr
hello
[root@localhost ~]# uniq -u abc
show me
555:rr
hello

実は-dと-uは正逆のコントラスト効果です
Cutコマンド――標準入力またはテキストファイルから領域または行ごとにテキストを抽出する
書式:cutオプションファイルcutおぷしょんふぁいる
オプションの意味
-c抽出された文字数または文字範囲の指定
-f抽出された領域の数または範囲を指定する
-d領域区切り文字の変更
[root@localhost ~]# cat abc
555:rr
60:bb
hello:333
[root@localhost ~]# cut -c1 abc
5
6
h
[root@localhost ~]# cut -c1-5 abc
555:r
60:bb
hello
[root@localhost ~]# cut -c2,4 abc
5:
0b
el

-c 1はabcファイルの最初の文字の列のみを抽出し、-c 1-5は1-5文字の列、-c 2,4は2番目と4番目の文字の列です.
-dは区切り記号、-fは指定領域を指定します.この2つのパラメータは通常一緒に使用します.
[root@localhost ~]# cat abc
555:rr
60:bb
hello:333
[root@localhost ~]# cut -d: -f2 abc
rr
bb
333

awkとの切り取りの差は少ないような気がします
スペースはcut-d""で表すこともできます
[root@localhost ~]# cat aaa
777 xxx
444444 xxxxx
[root@localhost ~]# cut -d" " -f2 aaa
xxx
xxxxx

cutを使ってIPを切り取ってもいいです
[root@localhost ~]# ifconfig eth0 | grep "inet addr" | cut -d: -f2 | cut -d" " -f1
192.168.1.1

この方法の原理はawkと同様に,IPフィールドを先にフィルタリングし,パーティションとしてフィルタリングし,第1領域をフィルタリングすることである.
sortと組み合わせてUIDをソートすることもできます
[root@localhost ~]# cat test
squid:x:23:23::/var/spool/squid:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin
leon:x:500:500::/home/leon:/bin/bash
tom:x:501:501::/home/tom:/bin/bash
[root@localhost ~]# sort -t: -k3n test | cut -d: -f3
23
43
86
500
501

これでUID部分を個別に切り取って並べ替え、もちろんawkでも実現できます
pasteコマンド――二つのファイルの内容を一緒に貼り付ける
オプションの意味
-dは区切り記号を指定し、デフォルトはtabキーを区切り記号とする
-s各ファイルを1行に貼り付ける
[root@localhost ~]# cat aa
aaa
bbb
ccc
[root@localhost ~]# cat bb
111
222
333
[root@localhost ~]# paste aa bb
aaa     111
bbb     222
ccc     333

貼り付け後はスペースで区切ります
[root@localhost ~]# paste aa bb > newfile
[root@localhost ~]# cat newfile
aaa     111
bbb     222
ccc     333

もちろん貼り付けた結果を別のファイルに出力してもいいですよ
[root@localhost ~]# cat aaa
777 xxx
444444 xxxxx
[root@localhost ~]# paste -d? abc aaa
555:rr?777 xxx
60:bb?444444 xxxxx
hello:333?

-dは指定された区切りです.デフォルトはtabキーで区切り記号なので、区切り記号を変更しましたか?なお、区切り文字は1文字のみ、-d***などの複数文字は指定できません.この効果は-d*のみです.
[root@localhost ~]# cat aa
aaa
bbb
ccc
[root@localhost ~]# cat bb
111
222
333
[root@localhost ~]# paste -s aa bb
aaa     bbb     ccc
111     222     333

-sは2つのファイルの内容を1行ずつ並べてマージできますが、効果はよくありません.
trコマンド――sedコマンドに似た文字変換機能を実現しますが、trコマンドは比較的簡単です
フォーマット:trオプション文字列1文字列2<標準入力ファイル、またはパイプ
オプションの意味
-c選択した文字列1の文字セットの補完、すなわち、逆選択文字列1の文字セット
-d文字列1に表示されるすべての文字を削除します(共通)
-s重複するすべての文字列を削除し、1つだけ保持します.
trコマンドは、パイプの後ろで使用するか、標準入力<"で使用します.
[root@localhost ~]# cat abc
555:rr
60:bb
hello:333
[root@localhost ~]# tr -d 555 < abc
:rr
60:bb
hello:333

abcから標準入力して555文字列に一致すると削除、-dは削除文字列です
[root@localhost~]# cat abc
555:rRAd
60:bB
heLLo:333
[root@localhost~]# tr -d A-Z < abc
555:rd
60:b
heo:333
abcテキストから大文字A-Z範囲の文字列を削除
同様に、0~9の範囲を削除することもできます.
[root@localhost ~]# cat abc
555:rRAd
60:bB
heLLo:333
[root@localhost ~]# tr -d 0-9 < abc
:rRAd
:bB
heLLo:

これで0-9の範囲の数字が削除されます
-s重複する文字を削除するには、1つだけ保持します.
[root@localhost ~]# cat aa
aaa
bbb
ccc
[root@localhost ~]# tr -s a,b < aa
a
b
ccc

指定した条件はa,bの2つの重複する文字で、それから重複を削除して1つだけ残します
複数の空白行を削除
[root@localhost ~]# cat aa
aaa
bbb
ccc
[root@localhost ~]# tr -s "
" < aa aaa bbb ccc

空白の行をすべて削除します.ここでは改行を意味します.
範囲を指定して削除することもできます
[root@localhost ~]# cat abc
WinnnneNrrrrTteeemmm
222223333441234
[root@localhost ~]# tr -s "[a-z][0-9]" < abc
WineNrTtem
2341234

残り1文字のみ削除
上記のコマンドをtr「[a-z][0-9]」[root@localhost ~]# cat abc WinnnneNrrrrTteeemmm 222223333441234 [root@localhost ~]# tr "[A-Z]" "9" < abc 9innnne9rrrr9teeemmm 222223333441234
これは、大文字の文字がすべて9に変更されたことにもマッチします.変更された文字は単一で、複数ではありません.たとえば、次のように注意してください.
tr「[A-Z]」「999」パイプ方式用trコマンドの使用
[root@localhost ~]# ifconfig eth0 | grep "inet addr"
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
[root@localhost ~]# ifconfig eth0 | grep "inet addr" | tr -d 19
          inet addr:2.68..  Bcast:2.68..255  Mask:255.255.255.0

これで一致する19の文字はすべて削除されます
ファイルのソート、マージはここまでです