Script Bash para fazer uma lista

Script Bash para fazer uma lista

Como escrevo um bashscript que faz listas selecionando uma coluna de uma planilha que está em csvformato?

Se eu tiver csvarquivos com este conteúdo:

        [user]$ cat list1.csv
        Last, First, user
        lname1, fname1, user1
        lname2, fname2, user2

        [user]$ cat list2.csv
        Last, First, user
        lname3, fname3, user3
        lname4, fname4, user4

E eu quero que o script seja invocado comoCreateList <column> <file1> <file2> ...

Por exemplo :

        [user]$ CreateList 2 list2.csv list1.csv
        list2: fname3, fname4
        list1: fname1, fname2

Responder1

Isto shnão é bash, mas bashpode executá-lo.

$ cat CreateList 
#!/bin/sh

col="$1"; shift

for file
do
        echo -n "$file:"
        cut -d, -f"$col" "$file" | sed 1d | tr '\n' ','| sed '$ s/,$//'
        echo
done

$ 
$ head -9 list*.csv
==> list1.csv <==
Last,First,user
lname1,fname1,user1
lname2,fname2,user2

==> list2.csv <==
Last,First,user
lname3,fname3,user3
lname4,fname4,user4
$ 

$ sh CreateList 2 list2.csv list1.csv
list2.csv:fname3,fname4
list1.csv:fname1,fname2
$ 

Responder2

Simplesmente invoque o awk apropriadamente

# print first column:
cat list1.csv | awk '{ORS="\t"} {print $1}'

Ou como script completo:

#!/bin/bash
column=$1
shift;
for item in "$@" ; do
  #process item
  echo "Processing $item:"
  cat $item | awk '{ORS="\t"} {print "'"$column"'"}'
done

Útil:

https://stackoverflow.com/questions/2021982/awk-without-printing-newline https://stackoverflow.com/questions/19075671/how-to-use-shell-variables-in-awk-script

Responder3

Talvez não seja a solução mais elegante, mas fornecerá a saída exata que você especificou, incluindo espaços:

#!/bin/bash

function CreateList()
{
  col="$1"
  shift
  cut -d ',' -f $col $@ | sed -r '1d ; s/^[ ]+|[ ]$// ; y/\n/ /; s/[ ]+$/\n/' | xargs echo | sed 's/ /, /'
}

for f in list2.csv list1.csv
do
  echo -n "${f//.csv}: "
  CreateList 2 "$f"
done

Saída:

list2: fname3, fname4
list1: fname1, fname2

Responder4

Simples bash:

#!/bin/bash
clm=$(($1 - 1))
shift
for file
do
    printf "%s: " "$file" 
    unset res 
    {
        read
        while IFS=,\  read -a line
        do
            res=(${res[*]} ${line[$clm]}) 
        done
    } <"$file"
    printf "%b, " "${res[@]}"\\n\\c
done

informação relacionada