J'ai un fichier .CSV avec le format ci-dessous:
"column 1","column 2","column 3","column 4","column 5","column 6","column 7","column 8","column 9","column 10
"12310","42324564756","a simple string with a , comma","string with or, without commas","string 1","USD","12","70%","08/01/2013",""
"23455","12312255564","string, with, multiple, commas","string with or, without commas","string 2","USD","433","70%","07/15/2013",""
"23525","74535243123","string , with commas, and - hypens and: semicolans","string with or, without commas","string 1","CAND","744","70%","05/06/2013",""
"46476","15467534544","lengthy string, with commas, multiple: colans","string with or, without commas","string 2","CAND","388","70%","09/21/2013",""
La 5e colonne du fichier a différentes chaînes. J'ai besoin de filtrer le fichier en fonction de la valeur de la 5ème colonne. Disons que j'ai besoin d'un nouveau fichier du fichier actuel qui n'a que des enregistrements avec la valeur "chaîne 1" dans son cinquième champ.
Pour cela, j'ai essayé la commande ci-dessous,
awk -F"," ' { if toupper($5) == "STRING 1") PRINT }' file1.csv > file2.csv
mais il me jetait une erreur comme suit:
awk: { if toupper($5) == "STRING 1") PRINT }
awk: ^ syntax error
awk: { if toupper($5) == "STRING 1") PRINT }
awk: ^ syntax error
J'ai ensuite utilisé ce qui suit, ce qui me donne une sortie étrange.
awk -F"," '$5="string 1" {print}' file1.csv > file2.csv
Production:
"column 1" "column 2" "column 3" "column 4" string 1 "column 6" "column 7" "column 8" "column 9" "column 10
"12310" "42324564756" "a simple string with a comma" string 1 without commas" "string 1" "USD" "12" "70%" "08/01/2013" ""
"23455" "12312255564" "string with string 1 commas" "string with or without commas" "string 2" "USD" "433" "70%" "07/15/2013" ""
"23525" "74535243123" "string with commas string 1 "string with or without commas" "string 1" "CAND" "744" "70%" "05/06/2013" ""
"46476" "15467534544" "lengthy string with commas string 1 "string with or without commas" "string 2" "CAND" "388" "70%" "09/21/2013" ""
PS: J'ai utilisé la commande toupper pour être du bon côté, car je ne suis pas sûr que la chaîne soit en minuscule ou en majuscule. J'ai besoin de savoir ce qui ne va pas avec mon code et si l'espace dans la chaîne compte lors de la recherche d'un modèle à l'aide d'AWK.
'","'
comme délimiteur, sinon cela aurait résolu mon problème ... excellente solution ...'","'
le délimiteur est ce que la plupart des réponses à votre question précédente suggéraient :).else{if(toupper($5)=="HYPERION"){print}}
. Pas sur mon ordinateur pour le moment, donc je peux avoir une mauvaise syntaxe mais vous ne pouvez pas donner de condition à une instruction else.awk -F '","' 'BEGIN {OFS=","} { if (NR==1) {print} else{if (toupper($5) == "STRING 1") print} }' file1
Le problème avec CSV est qu'il n'y a pas de norme. Si vous devez souvent traiter des données au format CSV, vous souhaiterez peut-être rechercher une méthode plus robuste plutôt que de simplement l'utiliser
","
comme séparateur de champ. Dans ce cas, lesText::CSV
modules CPAN de Perl sont exceptionnellement bien adaptés à la tâche:la source
la source
'","'
fera l'affaire ... merci ... :)awk 'BEGIN {FS = "," }' '{print $0}'
, vous verrez qu'il ne produit aucune sortie. À l'avenir, veuillez tester vos réponses pour voir si elles fonctionnent réellement avant de les publier.