Linuxコンソール上で行の要素をソートさせる

以下のようなファイルがあったとして、それを行ごとでソートするにはどうすればよいのだろう?とふと思ったので、調べてみた。

●cat /tmp/test2.txt

3 154 2 7 331 4 325
1 14 23 79 2 94 153
Sponsored Links

結論としては、whileで行ごとに一度sortコマンドでソートが行えるようにしてソートさせればよい。

cat 対象ファイル | while read line; do echo $line | sed 's/ /\n/g' | sort -n | awk '{line=line " " 
cat 対象ファイル | while read line; do echo $line | sed 's/ /\n/g' | sort -n | awk '{line=line " " $0} END {print line}' ; done
} END {print line}' ; done
blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test2.txt
3 154 2 7 331 4 325
1 14 23 79 2 94 153
blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test2.txt | while read line; do echo $line | sed 's/ /\n/g' | sort -n | awk '{line=line " " 
blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test2.txt
3 154 2 7 331 4 325
1 14 23 79 2 94 153
blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test2.txt | while read line; do echo $line | sed 's/ /\n/g' | sort -n | awk '{line=line " " $0} END {print line}' ; done
2 3 4 7 154 325 331
1 2 14 23 79 94 153
} END {print line}' ; done 2 3 4 7 154 325 331 1 2 14 23 79 94 153

 

2016/08/28 追記

もしくは、第24回シェル芸勉強会 Q7の解法のようにawkでasortを用いるという方法もあるようだ。

awk '{for(i=1;i<=NF;i++)a[i]=$i;asort(a);for(k in a){printf a[k]" "}print ""}'
[root@BS-PUB-CENT7-01 vol.24]# echo b a d c 2 3 1 |  awk '{for(i=1;i<=NF;i++)a[i]=$i;asort(a);for(k in a){printf a[k]" "}print ""}'
a b c d 1 2 3

 


Written by blacknon

インフラエンジニア(…のつもり)。 仕事で使うならクライアントはWindowsよりはUNIXの方が好き。 大体いつも眠い。

Leave a Comment

メールアドレスが公開されることはありません。

*