2017-06-15 2 views
1

Est-il possible d'extraire l'heure la plus jeune et la plus ancienne d'un fichier volumineux et de la mettre dans une variable? Par exemple (le fichier original est sans espaces):Récupère la date la plus jeune et la plus ancienne d'un fichier dans une variable (bash)

2020747462 170615095632 984732454353 
2020747462 170615143620 278645456456 
2020747462 170615103212 192040326564 
2020747462 170615035912 139583824564 

et obtenir

Youngest: 170615035912 
Oldest : 170615143620 

timeformat (AAMMJJHHMMSS) est sur une position fixe dans la rangée. J'ai regardé autour d'internet mais je n'ai pas pu trouver d'exemples ou quelque chose comme ça. J'espère qu'il y a quelqu'un qui sait comment faire ça à bash.

+0

'le fichier original est sans espaces'? Sinon, comment les champs seront-ils interprétés? – Inian

+0

Ces dates sont dans des positions fixes dans le fichier. Comme 2020747462170615095632984732454353. Les positions de la date dans cet exemple sont 11-22. – N3tM0nk

+0

S'il vous plaît poster comment vos fichiers d'origine ressemblent, je suppose sans espaces. Mettre à jour l'exemple de saisie – Inian

Répondre

1
cut -c11-22 file \ 
| sort \ 
| sed -n -e '1{s/^/Youngest: /;p};${s/^/Oldest : /;p}' 

La première ligne des caractères extraits 11-22 à partir du fichier, les prochaines trie les lignes de sortie, les dernières imprime la première et la dernière ligne, préfixer les mots les plus anciens et les plus jeunes.

+0

Cela fonctionne. Seulement j'ai besoin d'ignorer les 2 premiers au début du fichier et la dernière rangée à la fin du fichier. – N3tM0nk

+1

@ N3tM0nk: Commençons donc par 'queue -n + 3 | tête -n-1'. – choroba

0
perl -a -ne ' 
    BEGIN{$y=9} 
    next if $.==1 || $.==2 || eof; # to skip first second and last line 
    $y=$F[1] if $F[1] lt $y; 
    $o=$F[1] if $F[1] gt $o; 
    END{print "Youngest: $y\nOldest : $o\n"}' <file 
0

Pour être complet, ce qui suit est un exemple avec awk:

awk '{ dayt[NR]=$2 } END { asort(dayt,dat1);printf "Youngest:\t"dat1[1]"\nOldest:\t"dat1[NR]"\n" }' filename 

Où le nom de fichier est le fichier en question, mettre la deuxième colonne dans un tableau appelé dayt puis les trier par valeur à l'aide asort , en mettant les résultats dans dat1. Enfin imprimer les première et dernière entrées (dernier indice d'entrée signifié par NR)