对列表进行排序并用逗号而不是换行符分隔项目

对列表进行排序并用逗号而不是换行符分隔项目

我想按字典顺序在单个逗号分隔列表中列出所有文件系统。我正在使用这个命令:

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

如何将其更改为单行输出,并用逗号分隔每个文件系统?

我通过使用以下方法弄清楚了其中的一部分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

    如果我们到达这里,我们就是最后的队伍之一。在这种情况下,将保留空间移到模式空间中,并用逗号替换所有换行符。

要理解这一点,有助于识别H;1h;$!d;xawk 习惯用法,这意味着读入整个文件。

补充:排序

对名称进行排序:

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

答案2

paste是用于此目的的工具:

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

相关内容