有没有办法使用列(非字段)编号过滤使用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
答案 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”的字段。我省略了其余部分的字段宽度。一些字段宽度可以合并,但我不知道什么是空格作为分隔符而不是空格作为字段内容。