Подсчет столбцов проблем с производительностью - PullRequest
0 голосов
/ 29 мая 2018

У меня есть файл .csv с 130 000 строк.Я хочу прочитать все строки из этого файла и проверить, если число столбцов меньше 17, а затем добавить |0 в конце строки.

Сначала я вычислил количество столбцов, но только поПри этом время бега увеличилось с 10 до почти 3 минут.

Это то, что я пробовал:

while read line;
do
    nr_columns=$(echo $line | awk -F'|' '{print NF}')
    echo $line>> out
done<input_file.csv

Я пробовал также с tr, но время работы также увеличивается.

Как я могусделать это быстрее?

Спасибо всем.Вот что я сделал:

awk -v separator=$sep -v nr_fields=$header_col -F '$sep' '{ if (NF  < nr_fields) print $0separator0;else print $0}' input_file.csv > outputfile

Ответы [ 4 ]

0 голосов
/ 29 мая 2018

Если вы на самом деле не говорите "если запись содержит менее 17 полей, я знаю, что в ней 16 полей", тогда я добавлю столько новых полей, чтобы получить 17:

awk 'BEGIN {FS=OFS="|"} NF < 17 {for (i=NF+1; i<=17; i++) $i=0} 1' <<END
1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17
1|2|3|4|5|6|7|8|9|10|11|12|13|14
a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q
END
1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17
1|2|3|4|5|6|7|8|9|10|11|12|13|14|0|0|0
a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q

Некоторые причины, по которым ваш подход такой медленный:

  1. медленный bash
  2. bash read Команда ДЕЙСТВИТЕЛЬНО медленная: она читает один байт за раз
  3. вы вызываете awk один раз за строку
0 голосов
/ 29 мая 2018

Не уверен, что это то, что вы ищете, но это определенно эффективно.

#!/bin/bash

if [ ! $(head -1 input_file.csv | awk -F'|' '{print NF}') -eq 17 ]; then
  echo "input_file.csv does not have 17 columns"
  exit 2
fi

sed 's/$/\|0/g' input_file.csv > out

Сначала мы проверяем, действительно ли количество столбцов равно 17. Если нет, мы отправляем сообщение ивыход.Если мы хороши, мы продолжаем добавлять |0 к строкам.

0 голосов
/ 29 мая 2018

Похоже, все, что вам нужно:

awk -F'|' '{print $0 (NF<17 ? FS 0 : "")}' input_file.csv

, но это всего лишь предположение без краткого, тестируемого образца ввода и ожидаемого результата.

0 голосов
/ 29 мая 2018

Вы можете сделать это намного быстрее, осознав, что awk не только для однострочников - это настоящий язык программирования.Поместите это в файл foo.awk:

BEGIN {
    OFS="|"
}
NF < 17 {
    print $0,"0"
}
NF >= 17 {
    print
}

Затем запустите его как awk -F'|' -f foo.awk input_file.csv.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...