Как можно сгруппировать последовательные строки в bash?

#bash #command-line

#bash #командная строка

Вопрос:

У меня есть файл, который выглядит следующим образом:

 a
b
c
d
e
f
g
h
i
j
k
l
m
  

Я хочу переформатировать его следующим образом:

 a b c
d e f
g h i
j k l
m
  

Я хочу, чтобы количество столбцов можно было настраивать. Как бы вы поступили с bash? Я ничего не могу придумать.

Ответ №1:

 host:~ user$ cat file
a
b
c
d
e
f
g
h
i
j
k
l
m
host:~ user$ xargs -L3 echo < file
a b c
d e f
g h i
j k l
m
host:~ user$ 
  

Замените ‘3’ на количество столбцов, которое вы хотите.

Комментарии:

1. Моей первой мыслью было sed 'N;N;s/n/ /g' foo ; почему я не додумался использовать xargs для обработки текста?

2. Это должно быть -n3 , не так? -L является --max-lines , -n является ofr --max-args

3. Echo — это действие по умолчанию для xargs, так что xargs -L3 < file 🙂

Ответ №2:

Немного улучшенная версия ответа xargs была бы:

 xargs -n3 -r < file
  

Этот способ лучше обрабатывает завершающие пробелы и позволяет избежать создания одной пустой строки без ввода

Ответ №3:

Еще одна:

 zsh-4.3.11[t]% paste  -d  - - - < infile
a b c
d e f
g h i
j k l
m  
  

Или (если вас не волнует окончательный перевод строки):

 zsh-4.3.11[t]% awk 'ORS = NR % m ? FS : RS' m=3 infile 
a b c
d e f
g h i
j k l
m %     
  

Ответ №4:

Поскольку < оператор меняет порядок вещей на противоположный, я разработал этот более интуитивный подход:

 cat file | xargs -n3
  

Однако после тестов с большими файлами paste подход оказался намного быстрее:

 cat file | paste -d - - -
  

Ответ №5:

 column -x -c 30 /tmp/file
a       b       c
d       e       f
g       h       i
j       k       l
m
  

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