Awk 如何根据标题长度添加字段分隔符?

Awk 如何根据标题长度添加字段分隔符?,awk,field,Awk,Field,我正在尝试向以下文本格式添加分隔符(实际文件有更多字段) 我看到的是每个字段的长度由每个标题下方的每个下划线块的长度给出 输入: NAME ADDRESS PHONE --------------------- ------------------------------------------------------------ ------

我正在尝试向以下文本格式添加分隔符(实际文件有更多字段)

我看到的是每个字段的长度由每个标题下方的每个下划线块的长度给出

输入:

NAME                  ADDRESS                                                      PHONE       
--------------------- ------------------------------------------------------------ ------------
CLARK KENT            344 Clinton Street, Apartment 3D, midtown Metropolis         11111111    
TONY STARK            Malibu Point 10880, 902XX                                    22222222    
PETER PARKER          15th Street, Queens, New York City, New York                 33333333
所需输出:

NAME                 |ADDRESS                                                     |PHONE       
CLARK KENT           |344 Clinton Street, Apartment 3D, midtown Metropolis        |11111111    
TONY STARK           |Malibu Point 10880, 902XX                                   |22222222    
PETER PARKER         |15th Street, Queens, New York City, New York                |33333333
到目前为止,我的尝试是打印每个标题的长度,但我不知道如何在以下位置添加字段分隔符

$ awk 'FNR == 2 {for(i=1; i<=NF; i++) {print length($i)}}'
21
60
12

$awk'FNR==2{for(i=1;i您可以将此awk用于任何版本的
awk

awk-vofs='|''
NR==1{
h=$0
下一个
}
NR==2{

对于(i=1;i您可以将此awk用于任何版本的
awk

awk-vofs='|''
NR==1{
h=$0
下一个
}
NR==2{
对于(i=1;i使用GNU awk

wid=$(awk'
NR==2{
对于(i=1;i使用GNU awk

wid=$(awk'
NR==2{

对于(i=1;i就地
字段宽度

 $ awk -v OFS='|' 'NR==1 {h=$0; next} 
                   NR==2 {for(i=1;i<=NF;i++) f=f FS 1+length($i); 
                          FIELDWIDTHS=f; 
                          $0=h} 
                         {$1=$1}1' file

NAME                  |ADDRESS                                                      |PHONE
CLARK KENT            |344 Clinton Street, Apartment 3D, midtown Metropolis         |11111111
TONY STARK            |Malibu Point 10880, 902XX                                    |22222222
PETER PARKER          |15th Street, Queens, New York City, New York                 |33333333
$awk-vofs='|''NR==1{h=$0;next}

NR==2{(i=1;i就地
字段宽度

 $ awk -v OFS='|' 'NR==1 {h=$0; next} 
                   NR==2 {for(i=1;i<=NF;i++) f=f FS 1+length($i); 
                          FIELDWIDTHS=f; 
                          $0=h} 
                         {$1=$1}1' file

NAME                  |ADDRESS                                                      |PHONE
CLARK KENT            |344 Clinton Street, Apartment 3D, midtown Metropolis         |11111111
TONY STARK            |Malibu Point 10880, 902XX                                    |22222222
PETER PARKER          |15th Street, Queens, New York City, New York                 |33333333
$awk-vofs='|''NR==1{h=$0;next}

NR==2{表示(i=1;i,GNU awk表示字段宽度:

$ cat tst.awk
BEGIN { OFS="|" }
NR==1 { hdr=$0; next }
NR==2 {
    nf = split($0,f)
    for (i=1; i<=nf; i++) {
        FIELDWIDTHS = (i>1 ? FIELDWIDTHS " 1 " : "") length(f[i])
    }
    $0 = hdr
}
{
    for (i=1; i<=NF; i+=2) {
        printf "%s%s", $i, (i<NF ? OFS : ORS)
    }
}

对于字段宽度,使用GNU awk:

$ cat tst.awk
BEGIN { OFS="|" }
NR==1 { hdr=$0; next }
NR==2 {
    nf = split($0,f)
    for (i=1; i<=nf; i++) {
        FIELDWIDTHS = (i>1 ? FIELDWIDTHS " 1 " : "") length(f[i])
    }
    $0 = hdr
}
{
    for (i=1; i<=NF; i+=2) {
        printf "%s%s", $i, (i<NF ? OFS : ORS)
    }
}

非常感谢您的帮助。我知道如果输入格式正确,您的解决方案会起作用,但我看到了一些“错误”在一些领域,名字和姓氏之间有一个或两个以上的空格,所以我看到的最安全的逻辑是基于下划线标题长度。你们两个在这一点上都得到了认可。我曾与gawk的FIELDWIDTHS合作,但Glenn赢得了那场比赛。sed应该是我的第一个想法。非常感谢你们的帮助。如果nput的格式应该正确,但我看到了一些“错误”在一些领域,名字和姓氏之间有一个或两个以上的空格,所以我看到的最安全的逻辑是基于下划线标题长度。你们两个在这一点上都得到了认可。我曾与gawk的FIELDWIDTHS合作,但Glenn赢了那场比赛。sed应该是我的第一个想法。是的,结尾有尾随空格,非常感谢大家的支持您的帮助。我知道如果输入格式正确,您的解决方案会起作用,但我看到了一些“错误”在某些领域,名称和姓氏之间有一个或两个以上的空格,因此我看到的最安全的逻辑是基于下划线标题长度。是的,结尾有尾随空格,非常感谢您的帮助。我知道如果输入格式正确,您的解决方案会起作用,但我看到一些“错误”在某些领域,名称和姓氏之间有一个或两个以上的空格,因此我看到的最安全的逻辑是基于下划线标题长度。虽然我不是专家,但我认为这个解决方案有效,而且是最短的。非常感谢。主要问题是添加一个额外的“|”最后,虽然我不是专家,但我认为这个解决方案有效,而且是最短的。非常感谢。主要的问题是在末尾添加一个额外的“|”,非常感谢,它非常有效,唯一的问题是添加一个额外的“|”最后,我认为这是因为它的输入在每行的末尾都有空格。非常感谢,它工作得非常好,唯一的一点是添加了一个额外的“|”最后,我认为是因为输入在每行末尾都有空格,非常感谢您的帮助和tme,您的解决方案它工作了非常感谢您的帮助和tme,您的解决方案它工作了