使用awk按列(非字段)编号搜索

时间:2010-08-30 10:08:26

标签: awk

有没有办法使用列(非字段)编号过滤使用awk的行?我想获取文本文件中的所有行,其中包含分配给变量的字段6的值。我正在使用:

awk -v temp=${het} '{if $6 == temp} print $0}'  

但是我注意到,偶尔的字段5是空白的,这会使事情变得混乱。我真正需要的是

if colx-y == temp  

但这似乎不存在。有没有办法做到这一点

输入格式如下所述,我刚刚找到了另一种必须处理的变体。我想提取(在这种情况下)602.第五个字段可能存在也可能不存在,也可能会遇到第6个字段(下面两个例子)。文件格式包含第23-26列,包含第6个字段 - gawk听起来可能是更好的选择:

HETATM 5307  S   MOY A 602      14.660  14.666 109.556  1.00 26.41           S  
HETATM 5307  S   MOY   602      14.660  14.666 109.556  1.00 26.41           S  
HETATM 5307  S   MOY A1602      14.660  14.666 109.556  1.00 26.41           S     

4 个答案:

答案 0 :(得分:2)

请将示例输入添加到您的问题,而不是评论。目前还不清楚你的输入是怎样的。鉴于您的“正常”输入行:

HETATM 5307 S MOY A 602 14.660 14.666 109.556 1.00 26.41 S  

以下两项中的哪一项与您的输入匹配'字段5为空白':

HETATM 5307 S MOY  602 14.660 14.666 109.556 1.00 26.41 S  
HETATM 5307 S MOY   602 14.660 14.666 109.556 1.00 26.41 S  

在第一种情况下,ghostdog74's answer应该有效。他使用的-F"[ ]"只是在单个空格上分割的一种聪明方式。 -F" "不起作用,因为awk使用默认的空格分割。

如果您的数据属于第二种格式,我会使用substr()来提取正确的字段:

 awk -v temp=${het} 'substr($0, 20, 3) == temp'

另一种选择可能是使用gawk的fixed-width splitting,但它实际上取决于输入的完全格式。

答案 1 :(得分:0)

为什么不使用if else?

如下所示:

if $5 is not blank
{ 
if $6==temp print $0
}
else if $7==temp print $0

如果你提供一些样本输入,也会更容易理解!

答案 2 :(得分:0)

awk -F"[ ]" -v temp=${het} '$6==temp' file

答案 3 :(得分:0)

基于schot's建议和您的示例数据:

awk -v FIELDWIDTHS="6 1 4 2 1 3 3 1 1 1 3" '{print $11}'

FIELDWIDTHS中的最后一个“3”表示包含“602”的字段。我省略了其余部分的字段宽度。一些字段宽度可以合并,但我不知道什么是空格作为分隔符而不是空格作为字段内容。