2014-07-21 9 views
2

J'ai quelques fichiers texte comme indiqué ci-dessous. Je voudrais extraire les nombres de la deuxième colonne seulement si la 4ème colonne a 5 ou plus de nombres continus avec> 0.extraire des données à partir de fichiers texte

file1.txt

68.2 408  68.2 0 
33.4 409  30.3 3.1 
12.6 410  7.5  5.1 
90.7 411  55.0 35.7 
25.2 412  12.1 13.1 
55.9 413  .4  55.5 
27.3 414  4.8  22.5 
46.0 415  42.5 3.5 
10.6 421  10.6 0 
2.3  422  2.3  0 

file2.txt

72.2 63 62.4 9.8 
    10.7 65 .0 10.7 
    64.4 66 7.9 56.5 
    40.8 67 .0  40.8 
    16.0 68 15.0 1 
    21.2 69 21.2 0 
    31.5 70 2.6  28.9 
    26.0 71 21.3 4.7 
    112.1 72 74.9 37.2 
    86.8 73 86.2 .6 
    12.1 74 7.2  4.9 

sortie souhaitée

*file1.txt 
409 
410 
411 
412 
413 
414 
415 
*file2.txt 
63 
65 
66 
67 
68 
*file2.txt 
70 
71 
72 
73 
74 

Comment pourrais-je y parvenir? vos suggestions seraient appréciées !!

+0

Est-ce un fichier txt? les colonnes sont commandées en lignes régulières? – user3165438

Répondre

3

Avec awk:

#!/usr/bin/awk -f 
function print_all() { 
    if (i >= 5) { 
     print "*" FILENAME 
     for (j = 1; j <= i; ++j) 
      print a[j] 
    } 
    i = 0 
} 
$4 > 0 { 
    a[++i] = $2 
    next 
} 
{ 
    print_all() 
} 
ENDFILE { 
    print_all() 
} 

Exemple:

awk -f script.awk file1.txt file2.txt 

Version condensée:

awk 'function print_all() { if (i >= 5) { print "*" FILENAME; for (j = 1; j <= i; ++j) print a[j] } i = 0 } $4 > 0 { a[++i] = $2; next } { print_all() } ENDFILE { print_all() }' file1.txt file2.txt 

Sortie:

*file1.txt 
409 
410 
411 
412 
413 
414 
415 
*file2.txt 
63 
65 
66 
67 
68 
*file2.txt 
70 
71 
72 
73 
74 
+1

Excellent !! Merci beaucoup pour votre aide!! – manual

+0

Quel est le but de ENDFILE? –

+0

@Jidder Il s'exécute chaque fois qu'une session se termine par un fichier. – konsolebox

Questions connexes