gpt4 book ai didi

linux - 如何使 awk 不跳过空列?

转载 作者:太空狗 更新时间:2023-10-29 11:40:45 25 4
gpt4 key购买 nike

给定这个输入文件:

1234 1234 abcd
1234 abcd

当我运行时,awk 无法识别空列:

awk '{print $1,$2}' input_file

我得到:

1234 1234
1234 abcd

如何让awk给我:

1234 1234
1234

最佳答案

awk程序通常使用字段分隔符来决定哪些字符属于哪些字段。如果您的第二行仅包含空格,则无法使用 that 方法按您的意愿进行拆分。

但是,GNU awk允许你设置 FIELDWIDTHS更适合固定宽度数据的变量,因为这似乎是您所拥有的:

pax> cat infile
1234 5678 abcd
1234 abcd

pax> awk 'BEGIN{FIELDWIDTHS="4 1 4"}{print "<"$1","$3">"}' infile
<1234,5678>
<1234, >

在这种情况下是字段一和,因为字段二是第一和第二真实列之间的空间:

1234 5678 abcd
\__/|\__/|\__/
1 2 3 4 5

我通常这样做是因为我不希望空格成为数据的一部分(如果我想要在输出中使用不同字符,就像我的示例一样)但是,如果您无论如何转移空间,你也可以使用更简单的:

pax> awk 'BEGIN{FIELDWIDTHS="5 4"}{print "<"$1$2">"}' infile
<1234 5678>
<1234 >

在这种情况下,字段 1 是五个 个字符 1234<space> .


如果你想进行固定宽度处理,但能够轻松适应以后的宽度变化,你可以修改awk脚本,以便它从文件本身获取该信息。

不是来自实际的数据行,因为那里的字段可能有空格,但您可以添加标题行以完全指定要使用的宽度(当然要确保标题行不被视为数据)。

以下记录显示了此操作(awk 脚本现在在一个文件中,因为它变得越来越复杂):

pax> cat infile
#### ###### ####
1234 567890 abcd
1234 abcd

pax> cat awkfile.awk
NR == 1 {
# Header: construct field widths string
# "a 1 b 1 c 1 d ... z"
# where a..z are lengths of fields.

FIELDWIDTHS = length($1)
for (i = 2; i < NF; i++) {
FIELDWIDTHS = FIELDWIDTHS" 1 "length($i)
}
next
}
{
# Then use that FIELDWIDTHS string for
# all other records.

print "<"$1","$3">"
}

pax> awk -f awkfile.awk infile
<1234,567890>
<1234, >

您会发现您可以根据需要随意更改字段长度,并且只要标题行正确,它就会进行调整。

关于linux - 如何使 awk 不跳过空列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49764508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com