当某些行有空/缺失值时使用 awk 提取数据

Mis*_*san 5 grep sed awk text-processing gawk

我有一个示例,如下所示:

输入文件

   USERS        position   ref   rslt   
    usr1                    X     B   
    usr2          2980            C   
    usr3          3323      P      
    usr4                          A  
    usr5          5251      U      
    usr6          9990            A
    usr7          10345     T     
Run Code Online (Sandbox Code Playgroud)

我需要打印“rslt”列和相应的“USERS”,输出文件应该是这样的:

输出.txt

  USERS     rslt   
   usr1       B   
   usr2       C       
   usr4       A
   usr6       A 
Run Code Online (Sandbox Code Playgroud)

我尝试使用awk命令,但没有用。请注意,表格的所有黑色位置都填充了空格(每行空格数不同)

JJo*_*oao 12

在这种情况下,一种可能的解决方案是在开始部分提供字段的宽度:

awk 'BEGIN {FIELDWIDTHS = "16 11 6 7"} 
    $4 ~/[^ ]/ {print $1 $4}' 
Run Code Online (Sandbox Code Playgroud)

字段宽度可以手动计算,但对于复杂的标题,我喜欢从

 head -1 f | grep -Po '.*? (?=\S|$)' | awk '{print length}'
Run Code Online (Sandbox Code Playgroud)

更新:...或为了处理标题中的初始和最终空格:

 head -1 f | grep -Po '(^ *|\S).*?( (?=\S)|$)' | awk '{print length}'
Run Code Online (Sandbox Code Playgroud)


Dio*_*lis 6

AWK命令是不是这个事情最合适的工具。使用cut,它将要提取的字段的字符位置作为参数。因此,在您的示例中,指定USERS从字符位置 1 开始,以字符位置 8 结束,rslt从字符位置 33 开始。

$ cut -c 1-8,33- input.txt
   用户名
    用户1B
    用户2 C
    用户3
    用户4
    用户5
    usr6A
    用户7

有关如何计算字符位置的信息,请参阅以下内容。

         1 2 3         
123456789012345678901234567890123456789
   用户位置参考   
    usr1 XB   
    usr2 2980 C   
    usr3 3323 P      
    用户4  
    usr5 5251 U      
    usr6 9990 A
    usr7 10345吨