Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列中有空字段的awk_Awk - Fatal编程技术网

列中有空字段的awk

列中有空字段的awk,awk,Awk,这是我的文件.dat 运行awk“{print$2}”file.dat可提供: 但我想保留空白字段: A 4 U 怎么做 我必须补充一点: 第1列和第2列有3个空格字段分隔符 第2列和第3列以及第3列和第4列之间有一个空格字段分隔符 因此,在第2列中有两个字段缺少第2行和第4行,在第4列中有两个字段缺少第2行和第4行 还有两个字段缺少第3行和第5行,如果这不是您所需要的全部: $ awk -F'[ ]' '{print $4}' file A 4 U 然后编辑您的问题,以提供更具代表

这是我的文件.dat

运行awk“{print$2}”file.dat可提供:

但我想保留空白字段:

A

4

U
怎么做

我必须补充一点:

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

第2列和第3列以及第3列和第4列之间有一个空格字段分隔符

因此,在第2列中有两个字段缺少第2行和第4行,在第4列中有两个字段缺少第2行和第4行
还有两个字段缺少第3行和第5行,如果这不是您所需要的全部:

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

4

U
然后编辑您的问题,以提供更具代表性的示例和更清晰的要求。

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

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

根据观察,您的文件似乎有5列

首先需要确定字段分隔符是什么

此示例代码需要\t作为字段分隔符

awk -F'\t' '{print $3}' OFS='\t' file.dat
这将从文件中输出第三列。这是'read-in'字段分隔符-F'\t',OFS='\t'是'read-out'

A

4

U

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

a[i]:s get valus 0/1,带有此输入的h标头将为100010101,这将导致FIELDWIDTHS=4 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

但是,您需要从字段中删除空格。

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

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

将字段分隔符设置为精确的一个空格可能有助于GNU awk和mawk:awk-F'?''{print$2}文件在我的文件中,两列之间的精确字段分隔符不是常量,可以是一、二或七whitespace@olivierdadoun在这种情况下,如何定义第二列?@Cyrus awk-F'?'{print$2}'file在任何awk中的含义都是相同的,它并不意味着将字段分隔符设置为精确的一个空格,它意味着将FS设置为零或1个空白字符,但在给定该设置的情况下,任何awk实际尝试执行的操作都是YMMV。任何awk中的FS为awk-F'[]'''.''时,若要将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 
awk '{ print(substr($0,5,1)) }' file