Разобрать CSV в bash и назначить переменные

У меня есть csv формата (Работает на Bash в Linux)

DN , MAC , Partition ,  

123 , abc , xyz  
321 , asd , asd 

Я могу разобрать его с помощью awk, используя

eval MAC=($(awk -F "," '{print $1}' random.csv))

Это делается для каждого столбца в CSV, и поэтому я могу вызывать DN[2], MAC[2] и т. д. по отдельности, что выполняется вручную и анализирует их по отдельности.

Но как я могу разобрать csv по строке? Например: если я вызываю DN, это 123, соответствующие MAC и Partition также должны быть возвращены.


person Kaptain K    schedule 11.03.2013    source источник
comment
Вам нужна только первая совпадающая строка или должны быть возвращены все строки?   -  person Thor    schedule 12.03.2013


Ответы (3)


Попробуйте цикл:

while IFS=, read dn mac partition
do 
  echo "Do something with $dn   $mac and $partition"
done < file

Чтобы выбрать запись, вы можете использовать оператор case:

P2=123
while IFS=, read dn mac partition
do 
  case $dn in
    ($P2) echo echo "Do something with $dn   $mac and $partition" ;;
    (*)   echo "Do nothing" ;;
  esac
done < file
person Scrutinizer    schedule 11.03.2013
comment
используя это, я мог бы читать переменные по отдельности. Я мог бы вернуть их по отдельности, но я бы хотел, чтобы они читались по строкам. Например, если я вызываю строку 2, используя переменную P2 (скажем), она должна иметь возможность возвращать MAC (2), DN (2) и т. д. - person Kaptain K; 12.03.2013

Использование awk :

read -p "Gimme the DN integer >>> " i
awk -v i=$i -F' , ' '
    NR>1{
        dn[NR]=$1
        mac[NR]=$2
        partition[NR]=$3
    }
    END{
        for (a=2; a<=NR; a++)
            if (i == dn[a])
                print dn[a], mac[a], partition[a]
    }
' file.txt
person Gilles Quenot    schedule 11.03.2013

вы также можете попробовать это

file1 хранит все DN, для которых вы хотите получить информацию

#parse.awk

BEGIN { FS="," ; OFS= "\t"}

FNR==NR{ a[$1]; next }

$1 in a { print $1,$2,$3}

позвони awk -f parse.awk file1 csvfile.csv

person WYSIWYG    schedule 12.03.2013