#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
Да, интервал не совсем то, что вы хотели, но он будет обрабатывать входные данные переменного размера «лучше» (для некоторых определений «лучше»).