linux - awk 根据标志打印值

标签 linux sed awk

我有一个格式的数据文件

ID       Date            Sex     Age     r_val  r_flag  l_val    l_flag
0106610856   16/09/11    M   50      12.061  N       11.447  N
0107470802   09/09/11    F   64      3.146   A       4.338   A
0108490513   21/07/11    M   61      8.243   A   7.344   A
0108590534   18/08/11    M   52      4.714   A   5.106   A
0109480651   26/07/12    M   63      9.403   N   9.136   N
0110460758   21/07/11    M   64      5.643   I   4.272   I
0111290260   08/11/12    F   83      9.747   N   8.551   A
0111410339   07/02/13    M   71      4.979   A   4.482   A

我想做的是打印到一个新的文件 ID、性别、年龄和值(r_val 或 l_val,只要其相应的标志设置为 N)。这是上面的示例输出

0106610856        M      50      12.061 
0106610856        M      50      11.447         
0109480651        M      63      9.403   
0109480651        M      63      9.136   
0111290260        F      83      9.747  

我已尝试使用以下 Awk 命令来实现此目的:awk '{if ($6 ~/N/) print $1,$3,$4,$5; else if ($6 ~/N/) 打印 $1,$3,$4,$7}' 得到如下结果

0106610856 M 50 12.061
0109480651 M 63 9.403
0111290260 F 83 9.747

我知道这是不正确的格式,因为如果第一个条件为真,if 循环将不会搜索 if $8 ~/N/。因此,只有当 $6 条件为假时,我的 awk 命令才会在 $8 条件为真时选择 l_val。如果 r_flag 和 l_flag 都设置为 N,我该如何更改我的 awk 命令以获取 r_val 和 l_val。

最佳答案

不要使用 if .. else。通过这种方式,您很容易错过一个 $6==$8=="N" 案例。

试试这个内衬:

 awk 'NR>1{if($6=="N") print $1,$3,$4,$5; if($8=="N") print $1,$3,$4,$7 } ' file

关于linux - awk 根据标志打印值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15139941/

相关文章:

if-statement - 如何根据条件使连续行进入列?

c++ - 在没有 SO_LINGER > 0 的情况下强制关闭服务器端套接字会丢失数据,对吗?

java - 在 64 位 LInux RHEL5 上运行 Eclipse 64 位的问题

sed -i 触摸它不会改变的文件

unix - 如何在不更改所有权的情况下进行搜索和替换

regex - 使用 awk 进行字符串匹配

linux - Trac 在哪里存储它的环境信息

c - recvmsg() 不支持操作

linux - Sed 命令不工作 :Observed sed: unmatched '#'

sed - 修剪第 n 列 unix 的末尾