Как работать со всеми столбцами с кешем данных?

Вероятно, вы установили пакет cron-apt , который запускает apt-get update через равные промежутки времени.

1
22.02.2018, 17:53
4 ответа

No sé datamash, pero aquí hay una solución awk:

$ awk '{ for( col=1; col<=NF; col++ ) { totals[col]+=$col } } END { for( col=0; col<length(totals); col++ ) {printf "%s ", totals[col]}; printf "\n" } ' input
1332 1665 1998

Para hacer ese script awkmás legible:

{      // execute on all records
  for( col=1; col<=NF; col++ ) { 
    totals[col]+=$col 
  }; 
} 
END {  // execute after all records processed
  for( col=0; col<length(totals); col++ ) {
    printf "%s ", totals[col]
  }; 
  printf "\n";
} 
0
27.01.2020, 23:32
cols=$( awk '{print NF; exit}' foo); cat foo | datamash -t\  sum 1-$cols

o

cat foo | datamash -t\  sum 1-$( awk '{print NF; exit}' foo)

datamashtiene una función para especificar rangos de columnas, así que calcule el número de columnas y use ese resultado como parte de la especificación del rango. En mi solución de ejemplo, usé awkpara verificar solo la primera línea del archivo y salir, pero podría usar cualquier otra cosa que se adapte a sus necesidades. datamashen sí tiene una función -checkcuya salida incluye el número de columnas, pero en un formato que todavía necesitaría ser analizado para el número específico que le interese.

1
27.01.2020, 23:32

No veo una opción para especificar rango desconocido en manual de datamash

Prueba este perluno -trazador de líneas

$ perl -lane '$s[$_]+=$F[$_] for 0..$#F; END{print join " ", @s}' ip.txt
1332 1665 1998
    La opción
  • -adividirá automáticamente la línea de entrada en espacios en blanco, los resultados se guardan en la matriz @F
  • for 0..$#Fpara recorrer la matriz, $#Fda el índice del último elemento
  • $s[$_]+=$F[$_]guarde la suma en la matriz @s, por defecto el valor inicial será 0en contexto numérico. $_tendrá el valor del índice para cada iteración
  • END{print join " ", @s}después de procesar todas las líneas de entrada, imprime el contenido de la matriz @scon un espacio como separador
1
27.01.2020, 23:32

Использование datamashиbash:

n=($(datamash -W check < foo)); datamash -W sum 1-${n[2]} < foo

Выход:

1332    1665    1998

Как это работает:

  1. datamash -W check < fooвыводит строку "3 строки, 3 поля" .

  2. n=($(datamash -W check < foo))загружает эту строку в массив $n. Нам нужно количество полей, которое будет ${n[2]}.

  3. datamash -W sum 1-${n[2]} < fooсделает все остальное.


Это также можно сделать с оболочкой POSIX , используя сложную printfстроку форматирования вместо массива, но это сложнее:

datamash -W sum 1-$(printf '%0.0s%0.0s%s%0.0s' $(datamash -W check < foo)) < foo

Это также можно сделать с помощью инструментов оболочки:

datamash -W sum 1-$(head -1 foo | wc -w) < foo
0
27.01.2020, 23:32

Теги

Похожие вопросы