リストを並べ替え、改行ではなくカンマで項目を区切ります。

リストを並べ替え、改行ではなくカンマで項目を区切ります。

単一のカンマ区切りリストにすべてのファイルシステムをアルファベット順にリストしたいと思います。私は次のコマンドを使用しています:

cat /proc/filesystems | sed 's/nodev//' | sed 's/,$//'

私の出力は次のとおりです

sysfs
rootfs
ramfs
bdev
proc
cgroup
cpuset
tmpfs
devtmpfs
debugfs
securityfs
sockfs
pipefs
anon_inodefs
devpts
ext3
ext2
ext4
hugetlbfs
vfat
ecryptfs
fuseblk
fuse
fusectl
pstore
mqueue
binfmt_misc
vboxsf

各ファイルシステムをコンマで区切って、1行の出力にどのように変更できますか?

私はそれを使ってその一部を見つけましたxargs

cat /proc/filesystems | sed 's/nodev//' | xargs | sed -e 's/ /,/g' 

それでは、出力をアルファベット順にフォーマットしたいと思います。

答え1

awkを使う

awk '{printf "%s%s",(NR>1?",":""),$NF;} END{print""}'  /proc/filesystems

sedを使う

sed -r 's/^nodev//; s/^[[:blank:]]*//; H;1h;$!d;x; s/\n/,/g'  /proc/filesystems

どのように動作しますか?

  • s/^nodev//

    これはnodevすべての行の先頭から削除されます。

  • s/^[[:blank:]]*//

    これにより、各行の先頭のスペースが削除されます。

  • H

    これにより、現在の行が予約済みスペースに追加されます。

  • 1h

    最初の行にある場合は、予約済みスペースをこの行で上書きします。

  • $!d

    最後の行にない場合は、パターンスペースを削除して次の行から始めてください。

  • x; s/\n/,/g

    私たちがここに来たら、私たちは最後のチームの1つになります。この場合、予約済みスペースをパターンスペースに移動し、すべての改行をコンマに置き換えます。

これを理解するには、H;1h;$!d;xファイル全体を読むという意味のawk慣用語を認識するのが役立ちます。

補足: 整列

名前の並べ替え:

awk '{print $NF;}'  /proc/filesystems | sort | awk '{printf "%s%s",(NR>1?",":""),$NF;} END{print""}'

答え2

pasteこの目的で使用されるツールは次のとおりです。

sed 's/.*[[:blank:]]//' /proc/filesystems | paste -sd,

関連情報