Próbuję wymyślić, jak mogę użyć AWK do odejmowania linii. Na przykład wyobraź sobie, że plik wejściowy to:
30
20
Dane wyjściowe będą:
10
Teraz jako test próbuję obliczyć kolumnę pamięci „Używane” z:
$ cat /proc/meminfo
W tej chwili napisałem to:
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
-- Here comes the calculation using AWK
Próbowałem następujące:
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk '{print $2}' | awk '{$0-s}{s=$0} END {print s}'
Ale to daje mi tylko ostatni wiersz danych.
Znalazłem działające rozwiązanie, ale wątpię, aby było najbardziej optymalne. Całe moje doświadczenie w kodowaniu mówi mi, że twarde kodowanie liczby wierszy jest okropne: 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
? Czy chcesz tylko odjąć pierwsze dwa kolejne wiersze?Odpowiedzi:
Można też to zrobić przy użyciu
awk
,paste
orazbc
. Uważam, że takie podejście jest łatwiejsze do zapamiętania, a składniaawk
zawsze wymaga ode mnie sprawdzenia w celu potwierdzenia.UWAGA: Podejście to ma tę zaletę, że może konkurować z wieloma liniami wyniku, odejmując liczby 2, 3, 4 itd. Od liczby 1.
Detale
Powyższe służy
awk
do wybrania kolumny zawierającej liczby, które chcemy odjąć.Następnie używamy
paste
do połączenia tych 2 wartości wartości i dodania między nimi znaku minus.Gdy przekażemy to
bc
, wykonuje obliczenia.źródło
Rozwiązanie całkowicie awk, bez zbędnych poleceń cat lub grep:
awk '/MemTotal/ {TOT=$2} /MemFree/ {FREE=$2} END {printf("%d kB Used\n", TOT-FREE)}' /proc/meminfo
Widzę, że awk_FTW mnie pobiło, ale pomyślałem, że formatowanie wyjścia może być przyjemne.
źródło
Spróbuj tego:
źródło