Разделение файла: подставьте `egrep` в`sed`
Я хочу разделить мой файл $, содержащий x строк пополам, и проверить, сколько строк содержат "мертвые" в журнале. Я начал со следующего:
half=`expr $(egrep -c . $file) / 2`
sed -n 1,${half}p $file |
xargs echo $file $half $(egrep -c dead $I) > log_1
sed -n ${half},${egrep -c . $file}p |
xargs echo $file $half $(egrep -c dead $I) > log_2
выход за первый sed команда в порядке, но при замене egrep в диапазоне sed это идет не так
DeadOrAlive 5 2
-bash: ${half},${egrep -c . $file}p: bad substitution
Есть ли более эффективный способ разбиения файла в bash?
2 ответа
Вот решение Awk.
awk '/dead/ { a[++n] = NR }
END { for (i=1; i<=n; i++) if (a[i] > NR/2) break
print ARGV, int(NR/2), i-1 >"log_1";
print ARGV, int(NR/2)+(int(NR/2)!=NR/2), n-i+1 >"log_2" }' file
Собираем в массив a номера строк матчей. Затем мы выясняем, сколько номеров строк в массиве меньше, чем средняя линия; их количество назначено первому разделу. (Мы должны использовать i-1 потому что мы уже прошли точку разделения, когда мы break вне цикла.)
В общем, вы хотите избегать перечитывания одного и того же файла много раз, особенно если он может быть большим; и во-вторых, постарайтесь свести к минимуму количество процессов.
Непонятно, что вы ожидаете от среднего поля вывода. Если файл содержит нечетное количество строк, первая "половина" будет содержать на одну строку меньше, чем второй раздел. (Это не сложно изменить, но вы должны решить, так или иначе.)
С помощью
wc,headа такжеtail:half=$(( $(wc -l "$file")/2 )) head -$half | egrep -c dead | xargs echo "$file" $half > log_1 tail -$half | egrep -c dead | xargs echo "$file" $half > log_2С помощью
split:split -a1 --numeric-suffixes=1 -n 'l/2' "$file" "$file"_ echo "$file" "$file"_1 $(egrep -c dead "$file_1") > log_1 echo "$file" "$file"_2 $(egrep -c dead "$file"_2) > log_2 rm "$file"_[12]