awk与列中的空字段

时间:2019-02-10 16:44:19

标签: awk

这是我的file.dat

1   A 1 4
2     2 4
3   4 4
3     7 B
1   U 2

运行awk '{print $2}' file.dat给出:

A
2
4
7
U

但我想保留空白字段:

A

4

U

如何做到?

我必须在:之间加上它:

  • 第1列和第2列有3个空格字段分隔符

  • 第2列和第3列以及第3列和第4列之间的一个空白字段分隔符

因此,在第2列中缺少2个字段(第2行和第4行),在第4列中 还有2个字段缺失(第3行和第5行)

4 个答案:

答案 0 :(得分:1)

如果这还不是您所需要的:

$ awk -F'[ ]' '{print $4}' file
A

4

U

然后编辑您的问题,以提供更真实的示例和更明确的要求。

答案 1 :(得分:1)

如果输入为固定宽度的列,则可以使用substr提取所需的切片。我假设您要在索引5处输入一个字符:

awk '{ print(substr($0,5,1)) }' file

答案 2 :(得分:0)

您的awk代码缺少字段分隔符。

您的示例文件没有清楚显示字段分隔符是什么。

从观察结果看,您的文件似乎有5列。

您需要确定什么是字段分隔符。

此示例代码期望\t表示<TAB>作为字段分隔符。

awk -F'\t' '{print $3}' OFS='\t' file.dat

这将输出文件的第三列。这是“读入”字段分隔符-F'\t',而OFS='\t'是“读入”字段。

A

4

U

答案 3 :(得分:0)

对于GNU awk。它将文件处理两次。第一次,它检查所有字符串索引仅具有空格的记录,并将连续的空格序列视为构成FIELDWIDTHS variable的分隔符字符串。第二次将它用于固定宽度的数据处理。

a[i]:得到的值是0/1,此输入的h(标题)将为​​100010101,并导致FIELDWIDTHS="4 2 2 1"

1   A 1 4
2     2 4
3   4 4
3     7 B
1   U 2
|   | | |
100010101 - while(match(h,/10*/))
 \ /|/|/|     
  4 2 2 1

脚本:

$ awk '
NR==FNR {
    for(i=1;i<=length;i++)                              # all record chars
        a[i]=((a[i]!~/^(0|)$/) || substr($0,i,1)!=" ")  # keep track of all space places
    if(--i>m)
        m=i                                             # max record length...
    next
}
BEGINFILE {
    if(NR!=0) {                                         # only do this once
        for(i=1;i<=m;i++)                               #  ... used here
            h=h a[i]                                    # h=100010101
        while(match(h,/10*/)) {                         # build FIELDWIDTHS
            FIELDWIDTHS=FIELDWIDTHS " " RLENGTH         # qnd
            h=substr(h,RSTART+RLENGTH)                       
        }
    }
}
{ 
    print $2                                            # and output 
}' file file

并输出:

A

4 

U 

不过,您需要修剪字段中的空间。