web-dev-qa-db-fra.com

utiliser bash (sed/awk) pour extraire des lignes ET des colonnes dans des fichiers CSV?

Bash est-il capable de gérer l'extraction de lignes et de colonnes à partir de fichiers csv? En espérant que je n'ai pas à recourir au python ..

Mon fichier csv à 5 colonnes ressemble à:

Rank,Name,School,Major,Year
1,John,Harvard,Computer Science,3
2,Bill,Yale,Political Science,4
3,Mark,Stanford,Biology,1
4,Jane,Princeton,Electrical Engineering,3
5,Alex,MIT,Management Economics,2

Je veux seulement extraire le contenu de la 3ème, 4ème et 5ème colonne, en ignorant la première ligne, ainsi la sortie ressemble à:

Harvard,Computer Science,3
Yale,Political Science,4
Stanford,Biology,1
Princeton,Electrical Engineering,3
MIT,Management Economics,2

Jusqu'ici, je ne peux qu'empêcher awk d'imprimer soit chaque ligne, soit chaque colonne de mon fichier CSV, mais pas de colonnes/lignes spécifiques comme ce cas! Bash peut-il faire ça?

13
user1899415

Solutions Bash;

Utiliser IFS

#!/bin/bash
while IFS=',' read -r rank name school major year; do
    echo -e "Rank\t: $rank\nName\t: $name\nSchool\t: $school\nMajor\t: $major\nYear\t: $year\n"
done < file.csv
IFS=$' \t\n'

Utilisation de la manipulation des chaînes et des tableaux

#!/bin/bash
declare -a arr
while read -r line; do
    arr=(${line//,/ })
    printf "Rank\t: %s\nName\t: %s\nSchool\t: %s\nMajor\t: %s\nYear\t: %s\n" ${arr[@]}
done < file.csv
6
koola
awk -F, 'NR > 1 { print $3 "," $4 "," $5 }' 

NR est le numéro de ligne actuel, alors que $ 3, $ 4 et $ 5 sont les champs séparés par la chaîne donnée à -F

17
that other guy

Essaye ça:

tail -n+2 file.csv | cut --delimiter=, -f3-5
7
hennr

Utilisez cut et tail:

tail -n +2 file.txt | cut -d ',' -f 3-
5
Rubens
sed 1d file.csv | while IFS=, read first second rest; do echo "$rest"; done
3
glenn jackman

essaye ça

awk -F, 'NR > 1 { OFS=",";print $3, $4, $5 }' temp.txt

ou ca

sed -re '1d;s/^[0-9],\w+,//g' temp.txt
2
Mirage

Cela pourrait fonctionner pour vous (GNU sed):

sed -r '1d;s/([^,]*,){2}//' file
2
potong
Perl -F, -lane 'if($.!=1){print join ",",@F[2,3,4];}' your_file

vérifier ici

2
Vijay

Voilà, un simple programme AWK.

#!/usr/bin/awk -f

BEGIN {
    # set field separator to comma to split CSV fields
    FS = ","
}

# NR > 1 skips the first line
NR > 1 {
    # print only the desired fields
    printf("%s,%s,%s\n", $3, $4, $5)
}
2
steveha

J'ai créé un paquet pour ce genre de tâches - gumba Si vous êtes à l'aise avec Coffeescript, vous pouvez l'essayer.

cat file.csv | tail -n +2 | \
gumba "words(',').take((words)-> words.last(3)).join(',')"`
1
welldan97
grep '^,' Outlook.contacts.csv | sed 's/^,\([^,]*\),[^,]*,\([^,]*\),.*/\1 \2/'

Obtenez toutes les lignes qui commencent par un ,, puis utilisez sed pour remplacer les champs vides avec le prénom et le deuxième nom.

Soyez prudent pour une raison quelconque une fois que vous l'avez collé modifie la ligne en cela, alors vous feriez peut-être mieux de le faire manuellement.

grep '^,' Outlook.contacts.csv | sed 's/^,([^,]),[^,],([^,]),./\1 \2/'
0
user4126057