Como inserir uma coluna entre duas outras colunas de saída?

1

Por favor, note que estou ciente de isto e this

Eu quero combinar as saídas de dois comandos.

ls -1sh

e

wc -l

para que eu possa fazer algo como:

<combined command> o.img 1.img
  1512 412K 0.png
  1269 320K 1.png
  2781 732K total

Além disso, há um pequeno problema com o qual o ls não inclui a soma dos tamanhos.

    
por yukashima huksay 11.01.2018 / 07:12

2 respostas

2

ls não produzirá um total, mas du pode

du -sch *.csv
16K     LdevInfo.csv
8.0K    LunInfo.csv
4.0K    W.csv
4.0K    WwnInfo.csv
32K     total

wc produzirá um total

 wc -l *.csv
  101 LdevInfo.csv
   66 LunInfo.csv
   62 W.csv
    8 WwnInfo.csv
  237 total

simplesmente join

join -j 2 -o 1.1,2.1,2.2 v w
101 16K LdevInfo.csv
66 8.0K LunInfo.csv
62 4.0K W.csv
8 4.0K WwnInfo.csv
237 32K total

onde

  • -j 2 tell join para usar o campo 2 para correspondência
  • -o 1.1,2.1,2.2 print especificado fileld FILENUM.FIELDNUM

ou, você pode usar o awk adicional em um formato bonito

join -j 2  v w| awk '{printf "%s\t%s\t%s\n",$2,$3,$1}'
101     16K     LdevInfo.csv
66      8.0K    LunInfo.csv
62      4.0K    W.csv
8       4.0K    WwnInfo.csv
237     32K     total

PS: Eu não tenho *.png Eu uso *.csv , mas isso deve funcionar.

    
por 11.01.2018 / 12:03
1

No começo, você precisa corrigir o problema de ls que não inclui o total com a seguinte função:

myls() {
    if [ $# -gt 1 ] ; then
        ls -1sh "$@"
        ls -1s "$@" | cut -d' ' -f1 | awk '{s+=$1} END {print s}' | numfmt --to=iec --suffix=' total'
    else
        ls -1sh "$1"
    fi
}

Você pode colocar isso no seu .bashrc e carregá-lo.

Depois disso, você tem que combinar as saídas. Existem várias maneiras de fazer isso. Aqui está um: Primeiro você combina todas as saídas com pasta. infelizmente colar só aceita arquivos como argumentos, mas você pode usar pipes nomeados para cuidar disso:

combined() {
    paste <(wc -l "$@") <(myls "$@") | awk '{print $1, $3, $4}' | sort
}

Você pode colocar essa função no seu .bashrc agora. Eu os classifiquei porque acho que é legível no modo. Você pode remover | sort se não quiser ordená-los.

Se você não quiser usar uma função extra, pode fazer:

myd() {
    if [ $# -gt 1 ] ; then
        tmp='ls -1sh "$@";ls -1s "$@" | cut -d' ' -f1 | awk '{s+=$1} END {print s}' | numfmt --to=iec --suffix=' total''
    else
        tmp='ls -1sh "$1"'
    fi
    paste <(wc -l "$@") <(echo "$tmp") | awk '{print $1, $3, $4}' | sort
}
    
por 11.01.2018 / 07:27