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?
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
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
Essaye ça:
tail -n+2 file.csv | cut --delimiter=, -f3-5
Utilisez cut
et tail
:
tail -n +2 file.txt | cut -d ',' -f 3-
sed 1d file.csv | while IFS=, read first second rest; do echo "$rest"; done
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
Cela pourrait fonctionner pour vous (GNU sed):
sed -r '1d;s/([^,]*,){2}//' file
Perl -F, -lane 'if($.!=1){print join ",",@F[2,3,4];}' your_file
vérifier ici
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)
}
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(',')"`
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/'