Classifique uma lista e separe os itens com vírgulas em vez de novas linhas

2

Eu quero listar todos os sistemas de arquivos em uma única lista delimitada por vírgula, na ordem do dicionário. Estou usando este comando:

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

Minha saída é assim:

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

Como posso alterar isso para uma saída de linha única com vírgulas separando cada sistema de arquivos?

Eu percebi parte disso usando xargs :

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

Agora quero tornar a saída formatada em ordem de dicionário.

    
por TommyLan 27.06.2015 / 04:16

2 respostas

3

Usando o awk

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

Usando sed

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

Como funciona

  • s/^nodev//

    Isso elimina nodev do início de qualquer linha

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

    Isso elimina o espaço em branco principal de cada linha.

  • H

    Isso acrescenta a linha atual ao espaço de espera.

  • 1h

    Se estivermos na primeira linha, sobrescreva o espaço de espera com essa linha.

  • $!d

    Se não estivermos na última linha, exclua o espaço do padrão e comece novamente na próxima linha.

  • x; s/\n/,/g

    Se chegarmos aqui, somos a última linha. Nesse caso, mova o espaço de suspensão para o espaço de padrão e substitua todas as novas linhas por vírgulas.

Para entender isso, é útil reconhecer H;1h;$!d;x como um idioma do awk, o que significa ler em todo o arquivo.

Extra: classificação

Para classificar os nomes:

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

paste é a ferramenta para isso:

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