bash脚本行到列

jim*_*s17 1 unix bash awk sed

如何更改这样的文件:

A   25
B   26
A   14
D   39
E   42

A   74
B   36
A   81
D   96
E   17

A   23
B   14
A   74
D   87
E   17
Run Code Online (Sandbox Code Playgroud)

将行作为列,但只有一次,以及它们在列中的相应值?像这样:

 A   B     A   D    E
25   26   14   39  42
74   36   81   96  17
23   14   74   87  17
Run Code Online (Sandbox Code Playgroud)

我的列每29行重复一次,某些列(如A)具有相同的名称.

hek*_*mgl 5

您可以使用以下awk脚本来转换文件:

transform.awk:

{
    # On the first record this loop runs twice. once
    # for the headers once for the first line of data.
    # In all subsequent lines is prints only the data
    # because h==1.
    for(;h<=1;h++){
        for(i=1+h;i<=NF;i+=2){
            printf "%s ", $i
        }
        printf "\n"
    }
    h=1
}
Run Code Online (Sandbox Code Playgroud)

然后像这样执行:

awk -f transform.awk RS='' file
Run Code Online (Sandbox Code Playgroud)

输出:

A B A D E 
25 26 14 39 42 
74 36 81 96 17 
23 14 74 87 17
Run Code Online (Sandbox Code Playgroud)

要获得正确对齐的列,您可以管道column -t:

awk -f transform.awk RS='' file | column -t
Run Code Online (Sandbox Code Playgroud)

输出:

A   B   A   D   E
25  26  14  39  42
74  36  81  96  17
23  14  74  87  17
Run Code Online (Sandbox Code Playgroud)

这里的关键是变量的使用RS(记录分隔符).使用空字符串以RS空行分隔记录.它与将其设置为\n\n+(一个或多个空行)相同.示例的第一条记录如下所示:

A   25
B   26
A   14 
D   39
E   42
Run Code Online (Sandbox Code Playgroud)

awk默认情况下,拆分[[:space:]]+包括换行符.这为记录1提供了以下字段.

A 25 B 26 A 14 D 39 E 42
Run Code Online (Sandbox Code Playgroud)

上面显示的算法将此字段转换为所需的输出.