1
votes

Indexation des valeurs à partir du fichier

J'essaie désespérément d'accomplir une tâche à partir du travail et je n'arrive tout simplement pas à la comprendre.

Bref bref: je dois surveiller un fichier, ce qui produit des valeurs. Je parviens à isoler les valeurs dans un fichier séparé et je suis une chaîne pour allouer un index pour chaque valeur.

Description:

Mon fichier donné (fichier A) ressemblera à ci-dessous , mais avec plus de 10000 entrées:

x=value from file list.csv
for x in rage1 or range2 or range3 
 replace x with 0
for x in range 3 or range 4 or range 5
 replace x with 1

OR an if/else approach

x=values from list.csv
if x in range1 or range2 or range3 
  then replace x with 0
else if x in range4 range5 range6
  then replace x with 1

Toutes les valeurs à l'intérieur sont essentiellement des nombres entiers avec une plage comprise entre 103 et 17431. Pour chaque numéro individuel du fichier A, je dois allouer un valeur d'index de 0 à 9. Ma première approche a été d'utiliser sed afin de remplacer littéralement chaque chaîne du fichier A par la valeur donnée de son index spécifique, mais cela prend trop de temps pour mon gros fichier. Une autre approche qui m'a été recommandée était d'utiliser awk mais j'échoue aussi avec cela. Mon script ressemblait à ceci:

5
3
3
2
1
6
7
7

J'espérais une sortie comme:

awk '($0>=363 && $0<=499) || ($0>=4645 && $0<=4646) {$0="0"}1' tmp >tmp2

awk '($0>=2174 && $0<=2193)  {$0="1"}1' tmp >tmp2

awk '($0==500) || ($0>=12308 && $0<=12356) {$0="2"}1' tmp >tmp2

awk '($0>=103 && $0<=220) || ($0>=252 && $0<=299) || ($0>=1980 && $0<=1986) || ($0>=2921 && $0<=2922) {$0="3"}1' tmp >priority

awk '($0>=221 && $0<=251) || ($0>=8085 && $0<=8091) || ($0==8350) || ($0>=12809 && $0<=12945) || ($0>=16834 && $0<=17033)  {$0="4"}1' tmp >tmp2

awk '($0>=300 && $0<=362) || ($0=522) || ($0>=2923 && $0<=2925) || ($0>=3441 && $0<=3442) || ($0=4644)|| ($0>=5677 && $0<=5695) || ($0>=8082 && $0<=8083)|| ($0>=8093 && $0<=8349) || ($0>=12946 && $0<=12947) || ($0>=21986 && $0<=13215) || ($0>=13309 && $0<=13311)  {$0="5"}1' tmp >tmp2

Cela ne se produit pas. Je déclare les plages pour chaque index et j'essaye de remplacer chaque valeur en conséquence mais cela ne fonctionne pas. J'essaie de prendre une boucle for ou une approche if / else mais je ne sais pas comment, simplement parce que je suis nouveau dans ce domaine. Si quelqu'un peut m'aider avec une syntaxe qui m'aidera? J'essayais d'écrire quelque chose de similaire avec:

402
506
223
123
5667
17430
9921
9232

Quelqu'un peut-il m'aider avec ça? J'essaie de le faire de toutes les manières possibles (bash, pearl, python ...) donc toute idée est la bienvenue tant que cela est un peu expliqué, comme je le dis, je suis nouveau dans ce domaine. Merci.


5 commentaires

Pouvez-vous expliquer les règles de transformation, par exemple pour 402 à 5 ?


Qu'est-ce que ($ 0 = 522) est censé être? C'est une faute de frappe, non?


21986 est une faute de frappe pour 12986


Je serais plus consciencieux pour éliminer cette erreur .


merci, remarquez-le. Merci


3 Réponses :


2
votes

Exécuter avec perl so-57624956.pl

use 5.010;
use Set::IntSpan::Fast::XS qw();
my @intspans = map {
    Set::IntSpan::Fast::XS->new($_)
} (
    '363-499,4645-4646',
    '2174-2193',
    '500,12308-12356',
    '103-220,252-299,1980-1986,2921-2922',
    '221-251,8085-8091,8350,12809-12945,16834-17033',
    '300-362,522,2923-2925,3441-3442,4644,5677-5695,'
    . '8082-8083,8093-8349,12946-12947,12986-13215,13309-13311',
);
while (<>) {
    while (my ($index, $intspan) = each @intspans) {
        say $index if $intspan->contains($_);
    }
}


0 commentaires

2
votes

Quel était le problème avec le script awk? Voici la doublure awk one avec les plages que vous avez spécifiées et cela fonctionne comme prévu.

awk '{ if( ($1>=363 && $1<=499) || ($1>=4645 && $1<=4646)){ print 0}  
else if( ($1>=2174 && $1<=2193)) { print 1}  
else if( ($1==500) || ($1>=12308 && $1<=12356)){ print 2} 
else if( ($1>=103 && $1<=220) || ($1>=252 && $1<=299) || ($1>=1980 && $1<=1986) || ($1>=2921 && $1<=2922)){ print 3} 
else if( ($1>=221 && $1<=251) || ($1>=8085 && $1<=8091) || ($1==8350) || ($1>=12809 && $1<=12945) || ($1>=16834 && $1<=17033)){ print 4} 
else if( ($1>=300 && $1<=362) || ($1=522) || ($1>=2923 && $1<=2925) || ($1>=3441 && $1<=3442) || ($1=4644)|| ($1>=5677 && $1<=5695) || ($1>=8082 && $1<=8083)|| ($1>=8093 && $1<=8349) || ($1>=12946 && $1<=12947) || ($1>=21986 && $1<=13215) || ($1>=13309 && $1<=13311)){ print 5}
}' tmp > tmp2


0 commentaires

-1
votes

MERCI J23. Vous venez de sauver mon travail. Si jamais vous visitez Londres, dites quelque chose, je vous possède une bière. Donc, j'ai résolu le problème par vos instructions, simplement en ajoutant mon reste de valeurs. Une chose simple me pose des problèmes mais elle a été facile à réparer (pas de plainte ou quoi que ce soit).

##print out your column from the target file. Just replace "NR" with your column number
csvtool col "NR" /path.to/the/file.csv >tmp 
## Use AWK to look for the range and then act accordingly by replacing your value with the correct index. 
awk '{ 
if( ($1>=363 && $1<=499) || ($1>=4645 && $1<=4646)){ print 0}  
else if( ($1>=2174 && $1<=2193)) { print 1}  
else if( ($1==500) || ($1>=12308 && $1<=12356)){ print 2} 
else if( ($1>=103 && $1<=220) || ($1>=252 && $1<=299) || ($1>=1980 && $1<=1986) || ($1>=2921 && $1<=2922)){ print 3} 
else if( ($1>=221 && $1<=251) || ($1>=8085 && $1<=8091) || ($1==8350) || ($1>=12809 && $1<=12945) || ($1>=16834 && $1<=17033)){ print 4} 
else if( ($1>=300 && $1<=362) || ($1==522) || ($1>=2923 && $1<=2925) || ($1>=3441 && $1<=3442) || ($1==4644)|| ($1>=5677 && $1<=5695) || ($1>=8082 && $1<=8083)|| ($1>=8093 && $1<=8349) || ($1>=12946 && $1<=12947) || ($1>=21986 && $1<=13215) || ($1>=13309 && $1<=13311)){ print 5}
else if( ($1>=501 && $1<=504) || ($1>=566 && $1<=600) || ($1>=613 && $1<=637) ||  ($1>=2015 && $1<=2040) ||  ($1>=2103 && $1<=2126) || ($1>=2373 && $1<=2374) || ($1>=3828 && $1<=4125) || ($1>=4237 && $1<=4636) || ($1>=4647 && $1<=4889) || ($1>=4991 && $1<=5676) || ($1>=5696 && $1<=5705) || ($1>=6502 && $1<=6595) || ($1>=8429 && $1<=8460) || ($1>=8552 && $1<=8699) || ($1>=10487 && $1<=10977) || ($1>=11326 && $1<=11617) || ($1>=11688 && $1<=11815) || ($1>=11844 && $1<=11938) || ($1>=12490 && $1<=12597) || ($1>=12973 && $1<=12982) || ($1>=13367 && $1<=13414)){ print 6}
else if( ($1>=523 && $1<=548) || ($1>=555 && $1<=565) || ($1>=2005 && $1<=2014) || ($1>=2041 && $1<=2063) || ($1>=2091 && $1<=2102) ||  ($1==2394) || ($1>=2407 && $1<=2411) || ($1>=2926 && $1<=3008) || ($1>=3443 && $1<=3473) || ($1>=3486 && $1<=3813) || ($1>=4132 && $1<=4144) || ($1>=4637 && $1<=4643) || ($1>=4916 && $1<=4981) || ($1>=5711 && $1<=5741) || ($1>=6403 && $1<=6405) || ($1>=6415 && $1<=6466) || ($1>=6701 && $1<=7002) || ($1>=7035 && $1<=7048) || ($1>=8426 && $1<=8428) || ($1>=8496 && $1<=8541) || ($1>=8857 && $1<=9323) || ($1>=9429 && $1<=9618) || ($1>=9674 && $1<=9789) || ($1>=9802 && $1<=9811) || ($1>=9850 && $1<=10009) || ($1>=10131 && $1<=10136) || ($1>=10396 && $1<=10402) || ($1>=11000 && $1<=11175) || ($1==11618) || ($1>=12100 && $1<=12111) || ($1>=12212 && $1<=12219) || ($1==12489) || ($1>=12807 && $1<=12808) || ($1==12983) || ($1>=14616 && $1<=14627) || ($1>=15723 && $1<=15897)){ print 7}
else if( ($1==521) || ($1==554) || ($1>=601 && $1<=612) || ($1>=651 && $1<=708) || ($1>=1905 && $1<=1942) || ($1>=1949 && $1<=1979) || ($1>=1987 && $1<=1993) || ($1>=2259 && $1<=2278) || ($1>=2352 && $1<=2362) || ($1>=2395 && $1<=2406) || ($1>=2412 && $1<=2449) || ($1>=2673 && $1<=2919) || ($1>=3009 && $1<=3016) || ($1>=3814 && $1<=3827) || ($1>=4126 && $1<=4131) || ($1>=4982 && $1<=4990) || ($1>=5706 && $1<=5710) || ($1>=6012 && $1<=6181) || ($1>=6285 && $1<=6339) || ($1>=6409 && $1<=6411) || ($1>=6596 && $1<=6700) || ($1>=7191 && $1<=7424) || ($1==8081) || ($1>=8550 && $1<=8551) || ($1>=8700 && $1<=8716) || ($1>=9324 && $1<=9326) || ($1>=9619 && $1<=9624) || ($1==9729) || ($1>=10018 && $1<=10064) || ($1>=10115 && $1<=10126) || ($1>=10198 && $1<=10386) || ($1==10486) || ($1>=12112 && $1<=12115) || ($1>=12209 && $1<=12211)){ print 8}
else if( ($1>=489 && $1<=498) || ($1>=505 && $1<=520) || ($1>=549 && $1<=553) || ($1>=638 && $1<=650) || ($1>=709 && $1<=1904) || ($1>=1943 && $1<=1948) || ($1>=1994 && $1<=2004) || ($1>=2064 && $1<=2090) || ($1>=2127 && $1<=2173) || ($1>=2194 && $1<=2258) || ($1>=2279 && $1<=2351) || ($1>=2363 && $1<=2372) || ($1==2393) || ($1>=2450 && $1<=2672) || ($1>=3474 && $1<=3485) || ($1>=4145 && $1<=4236) || ($1>=4890 && $1<=4915) || ($1>=5742 && $1<=6011) || ($1>=7003 && $1<=7034) || ($1>=7049 && $1<=7295) || ($1>=7425 && $1<=8080) || ($1==8084) || ($1>=8352 && $1<=8425) || ($1>=8461 && $1<=8495) || ($1>=8542 && $1<=8549) || ($1>=8717 && $1<=8856) || ($1>=9327 && $1<=9428) || ($1>=9625 && $1<=9673) || ($1>=9790 && $1<=9791) || ($1>=9793 && $1<=9801) || ($1>=9812 && $1<=9849) || ($1>=10010 && $1<=10017) || ($1>=10065 && $1<=10114) || ($1>=10128 && $1<=10130) || ($1>=10137 && $1<=10197) || ($1>=10387 && $1<=10395) || ($1>=10403 && $1<=10485) || ($1>=10978 && $1<=10999) || ($1>=11176 && $1<=11325) || ($1>=11620 && $1<=11687) || ($1>=11816 && $1<=11843) || ($1>=11939 && $1<=12099) || ($1>=12116 && $1<=12208) || ($1>=12220 && $1<=12307) || ($1>=12357 && $1<=12488) || ($1>=12598 && $1<=12806) || ($1>=12948 && $1<=12972) || ($1>=13216 && $1<=13306) || ($1>=13312 && $1<=13366) || ($1>=13415 && $1<=14615) || ($1>=14628 && $1<=15722) || ($1>=15989 && $1<=16833) || ($1>=17402 && $1<=17431)){ print 9}
}' tmp > tmp2

doit être

($1==522)

Maintenant, si quelqu'un a besoin de faire quelque chose de similaire avec ma tâche, de surveiller un csv et de modifier les données en conséquence en ajoutant un index à certaines valeurs, faites simplement ce que j'ai fait avec l'aide de cette communauté.

($1=522)

Vous avez maintenant toutes vos données correctes dans un fichier séparé. Il vous suffit de le coller là où vous en avez besoin et de le supprimer après. Merci encore à la communauté.


0 commentaires