根据条件提取线

Rez*_*eza 5 sed awk shell-script text-processing

逗号分隔文件中的每一行都有 5 个字段。

a,b,c,d,e
f,g,c,i,
j,k,c,m,n
o,p,c,r,s
t,u,c,w,
x,y,z,aa,bb
Run Code Online (Sandbox Code Playgroud)

如何提取在第三个字段中有 c 并且它们的第 5 个字段不为空的行?结果将是:

a,b,c,d,e
j,k,c,m,n
o,p,c,r,s
Run Code Online (Sandbox Code Playgroud)

tal*_*zin 8

可能的解决方案awk

awk -F',' '$3 == "c" && $5' file
Run Code Online (Sandbox Code Playgroud)

根据实际数据,这可能无法像评论中提到的那样工作(感谢 Janis 指出这一点:它会丢失,f,g,c,i,0例如第 5 个字段为 0),因此您可以执行以下操作:

awk -F',' '$3 == "c" && $5 != ""' file
Run Code Online (Sandbox Code Playgroud)

因为这是公认的答案,所以我添加了不那么明显的强制第 5 个字段到字符串(如在 cuonglm(+1) 解决方案中):

awk -F',' '$3 == "c" && $5""' file
Run Code Online (Sandbox Code Playgroud)

  • 请注意,根据实际数据,这可能无法按预期工作。它不会匹配`f,g,c,i,0`,即最后一列中的`0`。修复当然很简单:`awk -F',' '$3 == "c" && $5 != ""`。 (4认同)