Script bash para hacer una lista

Script bash para hacer una lista

¿Cómo escribo un bashscript que crea listas seleccionando una columna de una hoja de cálculo que esté en csvformato?

Si tengo csvarchivos que tienen estos contenidos:

        [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

Y quiero que el script sea invocado comoCreateList <column> <file1> <file2> ...

Por ejemplo :

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

Respuesta1

Esto shno lo es bash, pero bashpuedo ejecutarlo.

$ 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
$ 

Respuesta2

Simplemente invoca awk apropiadamente

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

O como guión 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

Respuesta3

Quizás no sea la solución más elegante, pero proporcionará el resultado exacto que especificó, incluidos los espacios:

#!/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

Producción:

list2: fname3, fname4
list1: fname1, fname2

Respuesta4

Simple 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

información relacionada