можете попробовать эту команду awk.
$ xxxcommand | awk 'NR==1{printf("%-10s%-10s%-10s%-10s\n",$1,$2,$3,"calculation")}NR>1{printf("%-10s%-10s%-10s%-10s\n",$1,$2,$3,$2/$3)}' | mail_command
Name Files(n) Space calculation
Adam 12345 12345 1
Becky 45689 8987 5.0839
Maryanne 5598 7895 0.709056
Как насчет использования awk в режиме абзаца; разделение каждой нечетной записи на индексированный массив с последующим циклическим просмотром с использованием индексов следующей четной записи:
awk -vRS= -F'\n' '
NR%2 {split($0,a); next} {for (i=1;i<=NF;i++) print a[i],$i}
' OFS=, file
1,a
2,b
3,c
9,y
10,z
Использование разделителя полей новой строки делает его безопасным для более общего ввода, например данный файл2
foo
bar
baz bar
a
b
c
9
10
hello world
z
затем
awk -vRS= -F'\n' '
NR%2 {split($0,a); next} {for (i=1;i<=NF;i++) print a[i],$i}
' OFS=, file2
foo,a
bar,b
baz bar,c
9,hello world
10,z
Поскольку OP запросил, что входные значения могут быть любыми, и только двойная новая строка может использоваться в качестве руководства в комментирует , вот альтернативная версия скрипта (оригинал можно найти в истории редактирования этого ответа), использующий входной файл Steeldriver для тестирования:
#!/usr/bin/env python
from __future__ import print_function
import sys
columns = []
counter = 0
def print_columns(cols):
half = len(cols)/2
print("\n".join([ x+","+y for x,y in zip(cols[0:half],cols[half:]) ]))
with open(sys.argv[1]) as fd:
for line in fd:
if line.strip() == '':
counter+=1
continue
if counter >0 and counter%4 == 0:
print_columns(columns)
columns = []
counter = 0
columns.append(line.strip())
print_columns(columns)
Тестовый прогон:
$ cat input.txt
foo
bar
baz bar
a
b
c
9
10
hello world
z
$ ./columnate_file.py input.txt
foo,a
bar,b
baz bar,c
9,hello world
10,z
Другое решение, использующее awk
и bash
:
paste -d, <(awk -v RS='\n\n' 'NR%2' file) <(awk -v RS='\n\n' '!(NR%2)' file)
Это учитывает только пустые строки в качестве разделителей, непустые строки могут быть чем угодно.
Быстрое решение с вашим образцом входного файла (я копирую / вставляю ваши входные данные в локальный файл с именем c2.txt). Оно не было протестировано при всех условиях на предмет возможных сбоев, но вы можете попробовать и посмотреть, удовлетворяет ли вас результат.
$ paste -d"," <(grep -E '[0-9]' c2.txt) <(grep -E '[a-z]' c2.txt)
1,a
2,b
3,c
9,y
10,z
На самом деле я перебираю один и тот же файл дважды. Один для чисел, другой для строк и вставляю их вместе.