Linuxコンソール上で行の内容を逆にする(文字・単語での単位別)
Pocket

2018/04/26 一部コマンドを修正+追記

xargsとブレース展開を使うことで、うまいこと逆順に出力させることも可能だ。

コマンド | xargs -L1 bash -c 'eval eval echo \${$#..0}'
blacknon@BS-PUB-UBUNTU-01:~$ echo {a..e}{01..05} | xargs -n5
a01 a02 a03 a04 a05
b01 b02 b03 b04 b05
c01 c02 c03 c04 c05
d01 d02 d03 d04 d05
e01 e02 e03 e04 e05
blacknon@BS-PUB-UBUNTU-01:~$ echo {a..e}{01..05} | xargs -n5  | xargs -L1 bash -c 'eval eval echo \${$#..0}'
a05 a04 a03 a02 a01
b05 b04 b03 b02 b01
c05 c04 c03 c02 c01
d05 d04 d03 d02 d01
e05 e04 e03 e02 e01

 

もしくは、jqコマンドを使うという方法もある。

コマンド | jq -Rr 'split(" ")|reverse|join(" ")'
blacknon@BS-PUB-UBUNTU-01:~$ echo {a..e}{01..05} | xargs -n5
a01 a02 a03 a04 a05
b01 b02 b03 b04 b05
c01 c02 c03 c04 c05
d01 d02 d03 d04 d05
e01 e02 e03 e04 e05
blacknon@BS-PUB-UBUNTU-01:~$ echo {a..e}{01..05} | xargs -n5  | jq -Rr 'split(" ")|reverse|join(" ")'
a05 a04 a03 a02 a01
b05 b04 b03 b02 b01
c05 c04 c03 c02 c01
d05 d04 d03 d02 d01
e05 e04 e03 e02 e01

 

あと、無理やりtac -s ‘delim’で一行づつ処理をするという方法もありそうだ。

コマンド | sed -r 's/(.+)/printf " "|tac -s" "/ge;s/ $//g'

 

Linuxコンソール上で、文字・単語それぞれの単位で行の内容を逆にするにはどうすればよいのだろうか。

1.文字単位で行の内容を逆にする

文字単位で行の内容を逆にする場合は、普通にrevコマンドを使ってやればよい。

コマンド | rev
blacknon@BS-PUB-UBUNTU-01:/tmp$ echo "a bc def ghij"
a bc def ghij
blacknon@BS-PUB-UBUNTU-01:/tmp$ echo "a bc def ghij" | rev
jihg fed cb a

 

その他、awkやperlを使う場合は以下のようにする。

コマンド | awk '{ for(i=length;i!=0;i--)x=x substr($0,i,1);}END{print x}'
コマンド | perl -lne 'chomp;print scalar reverse'
コマンド | python -c "import sys;print sys.stdin.read().rstrip()[::-1]"
コマンド | ruby -pe '$_=$_.chop.reverse+"\n"'
blacknon@BS-PUB-UBUNTU-01:/tmp$ echo "a bc def ghij" | awk '{ for(i=length;i!=0;i--)x=x substr($0,i,1);}END{print x}'
jihg fed cb a
blacknon@BS-PUB-UBUNTU-01:/tmp$ echo "a bc def ghij" | perl -lne 'chomp;print scalar reverse'
jihg fed cb a
blacknon@BS-PUB-UBUNTU-01:/tmp$ echo "a bc def ghij" | python -c "import sys;print sys.stdin.read().rstrip()[::-1]"
jihg fed cb a
blacknon@BS-PUB-UBUNTU-01:/tmp$ echo "a bc def ghij" | ruby -pe '$_=$_.chop.reverse+"\n"'
jihg fed cb a
Sponsored Links

2.単語単位で行の内容を逆にする

単語の並びを逆にする場合は、awkを使って以下のようにする。

コマンド | awk '{for(i=NF;i>0;i--)printf("%s ",$i);print "";}'
blacknon@BS-PUB-UBUNTU-01:/tmp$ echo a bc def ghij |awk '{for(i=NF;i>0;i--)printf("%s ",$i);print "";}'
ghij def bc a

 

その他、pythonなどでは以下のようにする。

コマンド | perl -lne "print(join(' ',reverse(split(' '))))"
コマンド | python -c "import sys;print ' '.join(sys.stdin.read().rsplit()[::-1])"
コマンド | ruby -pe '$_=$_.chop.split(" ").reverse.join(" ")+"\n"'
blacknon@BS-PUB-UBUNTU-01:/tmp$ echo "a bc def ghij" | perl -lne "print(join(' ',reverse(split(' '))))"
ghij def bc a
blacknon@BS-PUB-UBUNTU-01:/tmp$ echo "a bc def ghij" | python -c "import sys;print ' '.join(sys.stdin.read().rsplit()[::-1])"
ghij def bc a
blacknon@BS-PUB-UBUNTU-01:/tmp$ echo "a bc def ghij" | ruby -pe '$_=$_.chop.split(" ").reverse.join(" ")+"\n"'
ghij def bc a

 

Pocket

Written by blacknon

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

Leave a Comment

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

*