Bir csv dosyasının bir sütunu nasıl çıkarılır

Bir csv dosyam varsa, yalnızca tek bir sütunun içeriğini yazdırmanın hızlı bir bash yolu var mı? Her satırın aynı sayıda sütuna sahip olduğunu varsaymak güvenlidir, ancak her sütun'un içeriği farklı uzunlukta olacaktır.

Çözüm

Bunun için awk kullanabilirsiniz. İstediğiniz n'inci sütuna '$2' değiştirin.

awk -F "\"*,\"*" '{print $2}' textfile.csv
Yorumlar (5)

Evet. 'cat mycsv.csv | cut -d ',' -f3' 3. sütunu yazdıracaktır.

Yorumlar (3)

Diğer cevaplar işe yarıyor, ancak sadece bash kabuğunu kullanarak bir çözüm istediğiniz için bunu yapabilirsiniz:

AirBoxOmega:~ d$ cat > file #First we'll create a basic CSV
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10

Ve sonra sütunları (bu örnekte ilk sütun) şu şekilde çekebilirsiniz:

AirBoxOmega:~ d$ while IFS=, read -a csv_line;do echo "${csv_line[0]}";done < file
a
1
a
1
a
1
a
1
a
1
a
1

Yani burada birkaç şey oluyor:

  • while IFS=, - bu, kabuğun alanları (metin bloklarını) ayırmak için kullandığı IFS (Dahili Alan Ayırıcı) olarak virgül kullanılmasını söyler. Yani IFS=, demek "a,b" demek gibidir, IFS=" " olsaydı "a b" ile aynı olurdu (varsayılan olarak budur.)

  • read -a csv_line; - bu, her satırı teker teker okumayı ve her öğenin "csv_line" olarak adlandırıldığı bir dizi oluşturmayı ve bunu while döngümüzün "do" bölümüne göndermeyi söyler

  • do echo "${csv_line[0]}";done < file - şimdi "do" aşamasındayız ve "csv_line" dizisinin 0. elemanına echo diyoruz. Bu işlem dosyanın her satırında tekrarlanır. "< file" kısmı sadece while döngüsüne nereden okuyacağını söyler. NOT: unutmayın, bash'te diziler 0 indekslidir, yani ilk sütun 0. elemandır.

İşte kabukta CSV'den bir sütun çekmek. Diğer çözümler muhtemelen daha pratiktir, ancak bu saf bash.

Yorumlar (0)