Медленная производительность функции sed для больших файлов данных (сценарий оболочки Linux)Linux

Ответить
Anonymous
 Медленная производительность функции sed для больших файлов данных (сценарий оболочки Linux)

Сообщение Anonymous »

Следующий скрипт принимает в качестве входных данных файл и количество столбцов данных, разделенных разделителем в этом файле. Сценарий определяет, есть ли какие-либо расхождения в данных из-за того, что символ перевода строки нарушает единообразие файла. Идея состоит в том, чтобы удалить нежелательный перевод строки (LF, CHR(13)) и объединить содержащие его строки.
Скрипт работает нормально, однако он слишком медленный. Мне нужен этот скрипт для обработки файла из 100 тысяч записей максимум за 10 секунд.
Каков наилучший способ?
#!/bin/bash
# Script expects two parameters.
# Parameter 1 $1: filename
# Parameter 2 $2 : number_of_columns_in $1 (file).

# Function to merge lines with less than 30 columns due to unwanted linefeed (LF) newline characters in data.
# If the number of columns separated by a | symbol are not as expected then merge current line with the next line and then
# recheck the count of columns and repeat till expected column count is reached.

merge_lines() { # Function to repeat a repeated task.
local line1=$(sed -n "${1}p" $1)
local line2=$(sed -n "${2}p" $1)

# Remove trailing newline from line1
line1="${line1%${line1##*[![:space:]]}}"

# Merge lines
merged_line="$line1|$line2"

# Replace original lines with merged line
sed -i "${1}d" $1
sed -i "${2}d" $1
sed -i "${1}i$merged_line" $1
}

# Loop until all lines have at least $2 columns or no more merging is possible as the end of file is reached

while true; do
# Count the number of lines in the file
line_count=$(wc -l < $1)

echo $line_count "-----"
echo $merged_line "-----"
# Exit loop if there is only one line left or no merging happened in the previous iteration
if [ $line_count -eq 1 ] || [ $merged_any -eq 0 ]; then
break
fi
# This merged_any Flag is to track if any merging happened in the current iteration
merged_any=0

# Loop through each line
for ((i=1; i

Подробнее здесь: https://stackoverflow.com/questions/793 ... ell-script
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»