awk:为每条记录提取特定信息

时间:2014-05-08 01:51:57

标签: awk

我文件的简化示例如下所示:

@ FamilyName_A
Information 1 2 3
Information 4 5 6 
@ FamilyName_B
Information 7 8 9
@ FamilyName_C
Information 10 11 12
Information 13 14 15
Information 16 17 18 

记录分隔符为@。对于我想要打印的每个记录:记录ID(系列名称(记录分隔符后面的第一个单词)和第一个下一行的列。对于这样的输出:

FamilyName_A Information 1
FamilyName_A Information 4
FamilyName_B Information 7
FamilyName_C Information 10
FamilyName_C Information 13
FamilyName_C Information 16

我自己尝试过这样做:

awk 'BEGIN {RS="@"} {print $1}'  -- This prints me Record ID

但我不知道如何做其余的事情(循环打印每个记录特定字段)。

2 个答案:

答案 0 :(得分:4)

使用以下脚本

$1 == @ { current=$2; next; }
{ print current, $1, $2; }

根据您的输入数据,捕获记录标题的表达式可能会略有变化。对于您提供的数据$1 == @/^@//^@ FamilyName/都非常合适,但如果您的输入数据略有不同,则可能需要调整条件。

答案 1 :(得分:1)

在一行:

awk 'BEGIN { family = ""} { if ($1 == "@") family = $2; else print family, $1, $2 }' input.txt

<强>解释

BEGIN {
  family = "";
}
{
  if ($1 == "@")
    family = $2
  else
    print family, $1, $2
}
  1. 将系列设置为空字符串。
  2. 检查每一行:如果以@开头,请记住姓氏。
  3. 如果没有@,请打印最后记住的姓氏和前两个字段。