J'essaie de comprendre comment je peux utiliser AWK pour soustraire des lignes. Par exemple, imaginez que le fichier d'entrée est:
30
20
La sortie serait:
10
Maintenant, en tant que test, j'essaie de calculer la colonne de mémoire "utilisée" à partir de:
$ cat /proc/meminfo
Donc, pour le moment, j'ai écrit ceci:
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
-- Here comes the calculation using AWK
J'ai essayé ce qui suit:
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk '{print $2}' | awk '{$0-s}{s=$0} END {print s}'
Mais cela me donne juste la dernière ligne de données.
J'ai trouvé une solution qui fonctionne, mais je doute que ce soit la plus optimale. Toute mon expérience de codage me dit que le codage en dur de la quantité de lignes est terrible: P
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk '{print $2}' | awk 'NR == 1{s=$0} NR == 2 {s=s-$0} END {print s}'
line1_$2 - line2_$2 - lineN-$2
? Voulez-vous uniquement soustraire les deux premières lignes consécutives?Réponses:
Vous pouvez aussi le faire en utilisant
awk
,paste
etbc
. Je trouve cette approche plus facile à retenir, la syntaxe deawk
me oblige toujours à rechercher les choses pour confirmer.REMARQUE: Cette approche a l'avantage de pouvoir faire face à plusieurs lignes de sortie, en soustrayant les 2e, 3e, 4e, etc. numéros du 1er.
Détails
Les utilisations ci-dessus permettent
awk
de sélectionner la colonne qui contient les nombres que nous voulons soustraire.Nous utilisons ensuite
paste
pour combiner ces 2 valeurs et ajouter le signe moins entre elles.Lorsque nous le transmettons,
bc
il effectue le calcul.la source
La solution purement awk, pas de commandes redondantes cat ou grep:
awk '/MemTotal/ {TOT=$2} /MemFree/ {FREE=$2} END {printf("%d kB Used\n", TOT-FREE)}' /proc/meminfo
Je vois awk_FTW me battre, mais je pense que le formatage de la sortie pourrait être agréable.
la source
Essaye ça:
la source