2010-08-28 10 views
1

J'ai essayé de trier les sorties à l'aide de AWK, et j'ai réussi à passer en revue certains des éléments du débordement de pile jusqu'à ce que j'atteigne la dernière partie de la commande ci-dessous.Mise en forme et syntaxe de la sortie AWK

-bash-3.2$ find /home/username/www/devdir -mindepth 2 -maxdepth 2 -type d -printf "%TY %Tm %Tb %Td,%TH:%TM,%p,\n" | grep "^$r" | grep Aug | sort -r | awk -F '/' '{print $1,$6","$7}' | awk -F " " '$1, { for (i=3; i<=NF; i++) printf("%s ", $i); printf("\n"); }' | head -10 
awk: $1, { for (i=3; i<=NF; i++) printf("%s ", $i); printf("\n"); } 
awk: ^syntax error 

La sortie ressemble ci-dessous:

2010 08 Aug 28,11:51, Directory Tom,005, 
2010 08 Aug 28,11:50, Directory Smith,004, 
2010 08 Aug 28,11:46, Directory Jon,003, 

Je veux que ça ressemble à:

2010 Aug 28,11:51, Directory Tom,005, 
2010 Aug 28,11:50, Directory Smith,004, 
2010 Aug 28,11:46, Directory Jon,003, 

Je woud aime couper le "08" hors de lui, et parfois sans perdre le tri effectué plus tôt. Cela passera à 09 le mois prochain et 10 le suivant, je crois que je peux utiliser Sed pour résoudre ce problème, mais je ne suis pas un expert avec elle. Quelqu'un peut-il nous éclairer sur ce que je devrais faire pour surmonter cet obstacle?

J'ai référencé cette question pour avoir une idée de ce que je devais faire: Sorting output with awk, and formatting it

Répondre

1

Que voulez-accomplissons exactement avec cette partie?

awk -F " " '$1, { }' 

je veux dire le 1 $ ...

En ce qui concerne la mise à jour:

sed 's/^\([0-9]\+\) 08 \(.\+\)$/\1 \2/' 

devrait réduire cela.

Ou plus générique:

sed 's/^\([0-9]\+\) [0-9][0-9] \(.\+\)$/\1 \2/' 
+0

Je veux garder l'année (2010). – eddylol

+0

J'ai mis à jour ma question pour clarifier comment je voulais que la sortie ressemble. – eddylol

+0

A travaillé comme un charme! – eddylol

1

Vous pouvez combiner vos greps en un seul et tous vos awks, seds et la tête tout en un seul script awk. Puisque vous ne remplissez qu'un mois et un an, vous n'avez pas besoin d'inclure le %Tm dans le find et vous ne faites que trier le jour et l'heure. Je suppose que $r est l'année.

Environ:

find /home/username/www/devdir -mindepth 2 -maxdepth 2 -type d -printf "%TY %Tb %Td,%TH:%TM,%p,\n" | grep "^$r.*Aug" | sort -r | awk -F '/' 'NR<=10{print $1,$6","$7}' 

Par ailleurs, voici comment vous feriez ce que vous vous apprêtez à faire:

printf($1" ");for (i=3; i<=NF; i++) printf("%s ", $i); printf("\n") 

Vous imprimerait le premier champ explicitement au lieu d'inclure par référence. Cependant, en utilisant mes suggestions ci-dessus, vous ne devriez pas avoir besoin de faire cela.