Сложенные записи в столбцы

можете попробовать эту команду 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
0
28.01.2017, 22:46
4 ответа

Как насчет использования 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
1
28.01.2020, 02:15

Python 2 скрипт

Поскольку 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
0
28.01.2020, 02:15

Другое решение, использующее awk и bash :

paste -d, <(awk -v RS='\n\n' 'NR%2' file) <(awk -v RS='\n\n' '!(NR%2)' file)

Это учитывает только пустые строки в качестве разделителей, непустые строки могут быть чем угодно.

3
28.01.2020, 02:15

Быстрое решение с вашим образцом входного файла (я копирую / вставляю ваши входные данные в локальный файл с именем 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

На самом деле я перебираю один и тот же файл дважды. Один для чисел, другой для строк и вставляю их вместе.

2
28.01.2020, 02:15

Теги

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