строки awk для нескольких столбцов - PullRequest
0 голосов
/ 23 мая 2018

Вводимый текст для выравнивания всех строк в этом формате

(LINE_A) - это имя файла, например, LINE_A, помещенный в каталог xy внутри этого файла, равен

file:G_VALUEFX:D_VALUEFX;SEAT01

, который возвращается

this

7 LINE_A G_VALUEFX D_VALUEFX SEAT01 SEAT02 SEAT03 SEAT04 

(число в 1-м столбце возвращает общее количество столбцов в строке)

, и мне нужна помощь с этими строками, чтобы преобразовать их из этих строк

например,

7 LINE_A G_VALUEFX D_VALUEFX SEAT01 SEAT02 SEAT03 SEAT04      
7 LINE_B G_VALUEFX D_VALUEFX SEAT22 SEAT25 SEAT27 SEAT30      
7 LINE_A G_VALUEFA D_VALUEFA SEAT01 SEAT02 SEAT03 SEAT04      
7 LINE_B G_VALUEFA D_VALUEFA SEAT22 SEAT25 SEAT27 SEAT30      

на столбцы

7 LINE_A    7 LINE_B    7 LINE_A     7 LINE_B 
G_VALUEFX   G_VALUEFX   G_VALUEFA    G_VALUEFA 
D_VALUEFX   D_VALUEFX   D_VALUEFA    D_VALUEFA 
SEAT01      SEAT22      SEAT01       SEAT22 
SEAT02      SEAT25      SEAT02       SEAT25 
SEAT03      SEAT27      SEAT03       SEAT27 
SEAT04      SEAT30      SEAT04       SEAT30 

(я не уверен, возможно ли преобразовать его таким образом, чтобы столбцы были выровнены таким образом)

7 LINE_A   |  7 LINE_B   | 7 LINE_A   |  7 LINE_B 
G_VALUEFX  |  G_VALUEFX  | G_VALUEFA  |  G_VALUEFA 
D_VALUEFX  |  D_VALUEFX  | D_VALUEFA  |  D_VALUEFA 
SEAT01     |  SEAT22     | SEAT01     |  SEAT22 
SEAT02     |  SEAT25     | SEAT02     |  SEAT25 
SEAT03     |  SEAT27     | SEAT03     |  SEAT27 
SEAT04     |  SEAT30     | SEAT04     |  SEAT30 

может случиться так, что некоторые строки должны быть длиннее и короче, например,

7 LINE_A G_VALUEFX D_VALUEFX SEAT01 SEAT02 SEAT03 SEAT04      
7 LINE_B G_VALUEFX D_VALUEFX SEAT22 SEAT25 SEAT27 SEAT30      
7 LINE_A G_VALUEFA D_VALUEFA SEAT01 SEAT02 SEAT03 SEAT04      
7 LINE_B G_VALUEFA D_VALUEFA SEAT22 SEAT25 SEAT27 EXNUM899999SSSSS9S8S5S2S8    
7 LINE_C G_PREFX D_VALUEFX SEAT01 SEAT02 SEAT03 SEAT04      
8 LINE_G G_PREFX D_VALUEFX POSITION55 POSITION82 VALUE85 POSITION44 POSITION448
7 LINE_C G_PREFA D_VALUEFA SEAT01 SEAT02 SEAT03       
4 LINE_H G_PREFA D_VALUEFA SEAT22
5 LINE_H G_NAMEA D_EXPIRY5 SEAT01 SEAT02 
3 LINE_H G_NAMEA D_EXPIRY5 
7 LINE_B G_NAMEY D_EXPIRY1 SEAT22 SEAT25 SEAT27 EXNUM899999SSSSS9S8S5S2S8     

, и результат при этом может выглядеть следующим образом (с указанием количества строк = больше столбцов, выровненных / расположенных друг относительно друга) если возможно с разделителем столбцов "|"всегда должен быть первый номер с LINE_A / B 2nd, за которым следует префикс G;3-ий префикс остатка D - это значения со случайной информацией (если это более удобно, не должно быть числа перед включением "LINE_A / B")

7 LINE_A    7 LINE_B     7 LINE_A      7 LINE_B                    7 LINE_C  8 LINE_G     7 LINE_C   4 LINE_H   5 LINE_H   3 LINE_H  7 LINE_B 
G_VALUEFX   G_VALUEFX    G_VALUEFA     G_VALUEFA                   G_PREFX   G_PREFX      G_PREFA    G_PREFA    G_NAMEA    G_NAMEA   G_NAMEY 
D_VALUEFX   D_VALUEFX    D_VALUEFA     D_VALUEFA                   D_VALUEFX D_VALUEFX    D_VALUEFA  D_VALUEFA  D_EXPIRY5  D_EXPIRY5 D_EXPIRY1
SEAT01      SEAT22       SEAT01        SEAT22                      SEAT01    POSITION55   SEAT01     SEAT22     SEAT01               SEAT22 
SEAT02      SEAT25       SEAT02        SEAT25                      SEAT02    POSITION82   SEAT02                SEAT02               SEAT25 
SEAT03      SEAT27       SEAT03        SEAT27                      SEAT03    VALUE85      SEAT03                                     SEAT27 
SEAT04      SEAT30       SEAT04        EXNUM899999SSSSS9S8S5S2S8   SEAT04    POSITION44                                              EXNUM899999SSSSS9S8S5S2S8 
                                                                             POSITION448  

Спасибо

1 Ответ

0 голосов
/ 23 мая 2018

awk на помощь!

$ awk -v OFS=' | ' '{a[NR,1]=$1 FS $2; 
                     for(j=3;j<=NF;j++) a[NR,j-1]=$j; 
                     maxNF=maxNF<NF?NF:maxNF}
                END {for(i=1;i<maxNF;i++)
                       for(j=1;j<=NR;j++)
                          printf "%s",a[j,i] (j==NR?ORS:OFS)}' file | column -ts'|'

7 LINE_A     7 LINE_B     7 LINE_A     7 LINE_B                     7 LINE_C     8 LINE_G       7 LINE_C     4 LINE_H     5 LINE_H     3 LINE_H     7 LINE_B
G_VALUEFX    G_VALUEFX    G_VALUEFA    G_VALUEFA                    G_PREFX      G_PREFX        G_PREFA      G_PREFA      G_NAMEA      G_NAMEA      G_NAMEY
D_VALUEFX    D_VALUEFX    D_VALUEFA    D_VALUEFA                    D_VALUEFX    D_VALUEFX      D_VALUEFA    D_VALUEFA    D_EXPIRY5    D_EXPIRY5    D_EXPIRY1
SEAT01       SEAT22       SEAT01       SEAT22                       SEAT01       POSITION55     SEAT01       SEAT22       SEAT01                    SEAT22
SEAT02       SEAT25       SEAT02       SEAT25                       SEAT02       POSITION82     SEAT02                    SEAT02                    SEAT25
SEAT03       SEAT27       SEAT03       SEAT27                       SEAT03       VALUE85        SEAT03                                              SEAT27
SEAT04       SEAT30       SEAT04       EXNUM899999SSSSS9S8S5S2S8    SEAT04       POSITION44                                                         EXNUM899999SSSSS9S8S5S2S8
                                                                                 POSITION448

если вы удалите форматированный column канал, выходные данные будут разделены символами канала (но не выровнены).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...