แยกวิเคราะห์ 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