Следующее должно работать в любой версии awk
, которая поддерживает пользовательские функции, а также встроенные sprintf ()
и rshift ()
функции. Сюда входит GNU awk.
Я позаимствовал и адаптировал алгоритм IP-адреса с десятичной дробью к четырем точкам отсюда:
Как упоминалось в моем комментарии, переписывание внешнего сценария cdrtoip
как awk-функции позволит избежать необходимости вызывать внешний сценарий более 500 000 раз.
awk -F, '
function cdrtoip(addr) {
return sprintf ("%d.%d.%d.%d",
rshift(and(addr,0xff000000),24),
rshift(and(addr,0x00ff0000),16),
rshift(and(addr,0x0000ff00),08),
rshift(and(addr,0x000000ff),00))
};
NR > 1 {
$8 = cdrtoip($8);
print
}' "$1.csv" >> "$1.csv.tmp"
Я запустил это в тестовом файле с 500 000 строками, и он завершился менее чем за 2 секунды:
$ wc -l input.csv
500000 input.csv
$ time ./michael.sh < input.csv > output.csv
real 0m1.956s user 0m1.935s sys 0m0.018s
Ваш каталог /opt
находится в корневой файловой системе. Ваша корневая файловая система заполнена.
Ваш каталог /home
находится в собственной файловой системе. Ваш домашний каталог не заполнен.
Ответы на ваш вопрос о поиске больших файлов см. в дубликатах вашего недавнего аналогичного вопроса .
Используйте k4dirstat
или baobab
, это графические инструменты, которые помогут вам определить, что занимает место. Предупреждение, он сообщит вам, что /usr
и несколько других системных каталогов используют много места, но мало о том, какие приложения. Однако для вас это отдельные крепления.
/opt
Ваш /
крошечный. У вас есть /usr
и /var
на разных креплениях, так что это может не быть проблемой, за исключением того, что /opt
является частью /
(, я полагаю, ).
Вы можете переместить /opt
в /home/opt
, а затем заменить /opt
символической ссылкой на /home/opt
.
mv -T /opt /home/opt ln -s -t / /home/opt
Если у вас /home
смонтирован noexec (или nosuid или может какой-то другой ), то он не будет работать без монтирования привязки,чтобы добавить эти разрешения.