1

Рассмотрим поток строк из одного слова, таких как стандартный вывод

$ echo foo bar baz quux xyxxy thud | tr ' ' '\n'
foo
bar
baz
quux
xyxxy
thud

Я говорю "одно слово", чтобы указать, что нет никаких пробелов, кроме новых строк. Я хотел бы "колонизировать" данные, заполняя фиксированное количество полей (не одиночных символов) на строку, по одной строке за раз. Для небольших объемов данных xargs делает это красиво:

$ echo foo bar baz quux xyxxy thud | tr ' ' '\n' | xargs -n 2
foo bar
baz quux
xyxxy thud

Однако использование xargs таким способом является медленным. У меня есть сотни гигабайт текста для обработки, поэтому я очень хотел бы, чтобы моя пропускная способность записи достигла 50 МБ / с или около того, чтобы я знал, что это аппаратное обеспечение способно (xargs выше на несколько порядков медленнее).

Есть ли что-то лучшее в стандартной панели инструментов? Я могу написать что-нибудь, если нужно, но я бы предпочел использовать текстовый фильтр, который уже есть.

2 ответа2

0

pr значительно недооценен.  Вот что я придумал:

% echo foo bar baz quux xyxxy thud | tr ' ' '\n' | pr -2 -a -s' ' -t
foo bar
baz quux
xyxxy thud
%

Опции могут отличаться в разных системах; см. свою страницу pr .

Я не пытался измерить эффективность этого.

0

Лучшее, что я могу придумать, это

$ echo foo bar baz quux xyxxy thud | tr ' ' '\n' \
  | perl -lne '$x.=" $_"; if(!($. % 2)){print $x; $x="";} END{print $x if $x}'
 foo bar
 baz quux
 xyxxy thud

или, возможно, более элегантный, но не короче

$ echo foo bar baz quux xyxxy thud bang| tr ' ' '\n' \
  | perl -ne 'chomp; print "$_ "; print "\n" if (!($. % 3)); END {print "\n"}'
foo bar baz
quux xyxxy thud
bang

Эффективность?

$ time perl -e 'print "foo\n" for (1..10000)' | xargs -n 3 > /dev/null

real    0m1.330s
user    0m0.500s
sys     0m0.830s


$ time perl -e 'print "foo\n" for (1..10000)' \
  | perl -ne 'chomp; print "$_ "; print "\n" if (!($. % 3)); END {print "\n"}' \ 
  > /dev/null

real    0m0.060s
user    0m0.030s
sys     0m0.030s

Первоначально я пробовал 1000000 слов, но сыт по горло ожиданием xargs, хотя perl был 1.45s

(Времена, сделанные на andLinux под Vista-32 на AMD-64 x2 5600+ 2,8 ГГц с 4 ГБ ОЗУ)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .