разделение файла: подставьте `egrep` в` sed`

231
ChemMod

Я хочу разделить мой файл $, содержащий x строк пополам, и проверить, сколько строк содержат « мертвые » в журнале. Я начал со следующего:

half=`expr $(egrep -c . $file) / 2`  sed -n 1,$p $file |  xargs echo $file $half $(egrep -c dead $I) > log_1 sed -n $,$p |  xargs echo $file $half $(egrep -c dead $I) > log_2 

вывод для первой sedкоманды в порядке, но при замене egrepв диапазоне sedон идет не так:

DeadOrAlive 5 2 -bash: $,$p: bad substitution 

Есть ли более эффективный способ разбиения файла в bash?

0
`$ (...)` и `$ {...}` - это разные конструкции. Первый - подстановка команд, второй - расширение параметров. choroba 6 лет назад 0
Ваш первый `egrep` считает непустые строки. `grep -c ^ file` выдаст общее количество строк, включая пустые строки. (Если ваш файл не содержит пустых строк, то, конечно, оба они эквивалентны.) `Wc -l tripleee 6 лет назад 0
Что вы ожидаете от `$ I`? tripleee 6 лет назад 0
`sed" $ half, \ $ "` выберет строки от `$ half` до конца файла, хотя ваш код будет включать самый средний файл (номер строки` $ half`) как в первой, так и во второй половине. tripleee 6 лет назад 0
`sed" 1, $ d "file` удалит первые строки` $ half` и выведет остальные. Благодаря этому вы можете правильно разделить файл на два непересекающихся раздела. tripleee 6 лет назад 0

2 ответа на вопрос

0
agc
  1. Используя 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 
  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] 
0
tripleee

Вот решение 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вне цикла.)

В общем, вы хотите избегать перечитывания одного и того же файла много раз, особенно если он может быть большим; и во-вторых, постарайтесь минимизировать количество процессов.

Непонятно, что вы ожидаете от среднего поля вывода. Если файл содержит нечетное количество строк, первая «половина» будет содержать на одну строку меньше, чем второй раздел. (Это не сложно изменить, но вы должны решить, так или иначе.)

Строго говоря, мы должны `закрыть () 'открываемые нами файлы, но пока их всего два, я не стал беспокоиться. tripleee 6 лет назад 0

Похожие вопросы