Разделение файла: подставьте `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]