Bash-Skript zum Erstellen einer Liste

Bash-Skript zum Erstellen einer Liste

Wie schreibe ich ein bashSkript, das Listen erstellt, indem es eine Spalte einer Tabelle auswählt, die im csvFormat vorliegt?

Wenn ich csvDateien mit diesem Inhalt habe:

        [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

Und ich möchte, dass das Skript aufgerufen wird alsCreateList <column> <file1> <file2> ...

Zum Beispiel :

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

Antwort1

Dies ist shnicht bash, bashkann es aber ausführen.

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

Antwort2

Rufen Sie einfach awk entsprechend auf

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

Oder als komplettes Script:

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

Hilfreich:

https://stackoverflow.com/questions/2021982/awk-without-printing-newline https://stackoverflow.com/questions/19075671/wie-man-shell-variables-in-awk-script verwendet

Antwort3

Dies ist vielleicht nicht die eleganteste Lösung, liefert aber genau die von Ihnen angegebene Ausgabe, einschließlich Leerzeichen:

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

Ausgabe:

list2: fname3, fname4
list1: fname1, fname2

Antwort4

Einfach 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

verwandte Informationen