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,您的解决方案它工作了