awk行到多列

awk行到多列,awk,multiple-columns,transformation,lines,Awk,Multiple Columns,Transformation,Lines,用于对齐行的输入文本采用此格式 (行_A)是文件名,例如放置在目录xy中的行_A 该文件的内部是 file:G_VALUEFX:D_VALUEFX;SEAT01 又回来了 这个 (第1列中的数字是返回的第行总列数) 我需要这条线的帮助来将它们从这条线转换过来 e、 g 到列 7 LINE_A 7 LINE_B 7 LINE_A 7 LINE_B G_VALUEFX G_VALUEFX G_VALUEFA G_VALUEFA D_VALUEFX D_VA

用于对齐行的输入文本采用此格式

(行_A)是文件名,例如放置在目录xy中的行_A 该文件的内部是

file:G_VALUEFX:D_VALUEFX;SEAT01
又回来了

这个

(第1列中的数字是返回的第行总列数)

我需要这条线的帮助来将它们从这条线转换过来

e、 g

到列

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     
然后,如果可能的话,使用列分隔符“|”,输出可能如下所示(给定的行数=彼此对齐/放置的列数) 任何时候都应该有第一个放置的编号,第二行是A/B,后面是G前缀;第三个D前缀rest是带有随机信息的值 (如果更方便,则“A/B行”前不应包含编号)


谢谢你营救我

$ 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
$awk-vofs='|'{a[NR,1]=$1fs$2;

对于(j=3;jIt是完全可行的,但有点复杂。您必须将整个文件读取到内存中-最后一行可能包含最多的字段和最宽的字段,在您读取它之前,您将不知道输出需要有多大。对于其余的,您需要在每行输入中保留一个最宽值的记录,因为这将控制最宽的字段然后您需要使用
printf()
%.*s
排列打印控件,其中
*
表示“由整数指定的宽度”。
printf(“%s”,宽度[colno],数据[colno,lineno])
或其他。您可以生成垂直条。您似乎有几个不同的文本块,它们都以不同的方式表示示例输入(例如
文件:g_VALUEFX:D_VALUEFX;SEAT01
vs
7行文件g_VALUEFX D_VALUEFX SEAT01 SEAT02 SEAT03 SEAT04
和不同的内容。我不清楚您是否告诉我们您有一个输入文件(例如,一个文件包含行A、行B等)或多个文件(名为行A、行B等)。请您的问题显示您要转换为发布的预期输出的示例输入(如果是多个文件,则显示该文件)。@EdMorton:OP显示了两个示例输入和相应的预期输出-这是一项很好的工作。没有任何证据表明您试图生成一个程序来解决此问题(无MCVE-),但它们显示了良好的预期输入和输出。@JonathanLeffler什么是示例输入?一个名为LINE_a的文件是否包含
文件:G_VALUEFX:D_VALUEFX;SEAT01
示例输入文件?如果是的话-什么是
7 LINE_a G_VALUEFX D_VALUEFX SEAT01 SEAT02 SEAT03 SEAT04
,如果不是-它是什么?我觉得OP可能有一些工具可以“将一堆第一种格式的文件转换为一个第二种格式的文件,这是一种中间步骤,几乎肯定是不必要的步骤,但我真的不知道,所以我希望操作能够澄清并向我们展示。@EdMorton:好的-我跳过了
file:…
-与其他sourc相比,这似乎是一种误导。”但是我必须同意这是一个混乱的空间。谢谢您在这里添加了“sed's/\r/'”以避免错误的输出格式,使其成为unix样式的格式,或者可能被awk替换?发现了以下几个示例,如:sub(/\r/,“”)但不确定将该查询放在何处或通过另一个管道awk查询调用它?通常,它通过多个awk管道查询进行管道传输是否正常?@ya801:在开始处理之前,您应该将输入转换为Unix格式;保留回车符会使一切变得混乱。有一个
dos2unix
命令可以完成此操作;您还可以在作业中使用
tr
,或者使用一些版本的
sed
(您可以使用Perl、Python等,也可以自己编写,尽管这可能不是一个好主意)。正如Windows代码被Unix行结尾打乱一样,Unix代码也会打乱(不同)通过Windows行结尾。请确保您使用的是您所在系统的干净数据。@JonathanLeffler您好,我已经通过
sed的/\r/“| awk..
完成了此操作,但我再次使用创建的新进程“sed”调用如果我将管道它不确定是否awk管道与awk或sed管道与awk或然后由cat将被威胁为新的进程,使其在大文件上产生结果,处理文件的性能问题,这对我来说是什么大文件?如果你正在转换为这样的列形式,一千列,从你的例子判断,高达大约一个dozen列的值将非常大。这将使用大约1兆字节的数据。这不会给现代设备带来处理问题——甚至对大多数古董来说,这也不会是一个大问题。在担心之前,先证明您有性能问题。中的管道应该是可减少的。
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     
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  
$ 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