Problème de délimiteur de fichier source

Je suis confronté à un problème avec mon fichier source. Considère que j’ai des données suivantes dans un fichier-

"dfjsdlfkj,fsdkfj,werkj",234234,234234,,"dfsd,etwetr" 

ici, le délimiteur est une virgule, mais certains champs ont une virgule dans les données. Ces champs sont entre guillemets. Je veux extraire quelques colonnes du fichier.

Si j’utilise cut -d "," -f 1,3 je reçois une sortie comme-

 "dfjsdlfkj,werkj" 

Je vous suggère d’utiliser un parsingur csv . Par exemple, python en a un en tant que module intégré, il suffit donc de l’ importer :

 import sys import csv with open(sys.argv[1], newline='') as csvfile: csvreader = csv.reader(csvfile) csvwriter = csv.writer(sys.stdout) for row in csvreader: csvwriter.writerow([row[e] for e in (0,2)]) 

En supposant que votre exemple de ligne se trouve dans un fichier d’entrée nommé infile , exécutez le script en tant que:

 python3 script.py infile 

Cela donne:

 "dfjsdlfkj,fsdkfj,werkj",234234 

Vous pouvez essayer ce qui suit:

 awk -f getFields.awk input.txt 

input.txt est votre fichier d’entrée et getFields.awk est:

 { split("",a) splitLine() print a[1],a[3] } function splitLine(s,indq,t,r,len) { # Assumptions: # * spaces before or after commas are ignored # * spaces at beginning or end of line is ignored # definition of a quoted parameter: # - starts with: (^ and $ are regexp characters) # a) ^" # b) ," # - ends with: # a) "$ # b) ", s=$0; k=1 s=removeBlanks(s) while (s) { if (substr(s,1,1)=="\"") indq=2 else { sub(/[[:blank:]]*,[[:blank:]]*"/,",\"",s) indq=index(s,",\"") if (indq) { t=substr(s,1,indq-1) splitCommaSsortingng(t) indq=indq+2 } } if (indq) { s=substr(s,indq) sub(/"[[:blank:]]*,/,"\",",s) len=index(s,"\",") #find closing quote if (!len) { if (match(s,/"$/)) { len=RSTART-1 } else len=length(s) r=substr(s,1,len) s="" } else { r=substr(s,1,len-1) s=substr(s,len+2) } a[k++]=r } else { splitCommaSsortingng(s) s="" } } k=k-1 } function splitCommaSsortingng(t,b,i) { n=split(t,b,",") for (i=1; i<=n; i++) a[k++]=removeBlanks(b[i]) } function removeBlanks(r) { sub(/^[[:blank:]]*/,"",r) sub(/[[:blank:]]*$/,"",r) return r }