使用sed从给定表的最后一行中提取字段

时间:2013-04-17 18:45:05

标签: bash sed awk grep

我想写一个bash脚本来提取表格最后一行的字段。我将举例说明。我有一个文本文件,其中包含空格分隔字段的表格,如...

Table 1 (foobar)
num  flag  name   comments
1    ON    Frank  this guy is frank
2    OFF   Sarah  she is tall
3    ON    Ahmed  who knows him

Table 2 (foobar)
num  flag  name   comments
1    ON    Mike   he is short
2    OFF   Ahmed  his name is listed twice

我想提取Table1的最后一行中的第一个字段,即3。理想情况下,我希望能够使用任何给定表的标题来执行此操作。每张桌子之间都有保证回车。什么是实现这一目标的最佳方法,最好使用sed和grep?

4 个答案:

答案 0 :(得分:4)

Awk非常适合这种情况,打印每条记录最后一行的第一个字段:

$ awk '!$1{print a}{a=$1}END{print a}' file
3
2

仅从第一条记录开始:

$ awk '!$1{print a;exit}{a=$1}' file
3

修改

对于给定的表标题:

$ awk -v t="Table 1" '$0~t{f=1}!$1&&f{print a;f=0}{a=$1}END{if (f) print a}' file
3

$ awk -v t="Table 2" '$0~t{f=1}!$1&&f{print a;f=0}{a=$1}END{if (f) print a}' file
2

答案 1 :(得分:2)

这个sed系似乎适合你的样品。

table='Table 2'
sed -n "/$table"'/{n;n;:next;h;n;/^$/b last;$b last;b next;:last;g;s/^\s*\(\S*\).*/\1/p;}' file

说明:当我们在$ table中找到与表名匹配的行时,我们跳过该行,然后跳过下一行(字段标签)。从下一步开始:我们将当前行推入保留空间,获取下一行并查看它是否为空或文件末尾,如果不是,我们返回到:next,将当前行推入hold并获取另一行。如果它是空白或EOF,我们跳到:最后,将保持空间(表格的最后一行)拉到图案空间中,除了第一个字段以外的所有字段并将其打印出来。

答案 2 :(得分:2)

只需将每个块作为记录读取,每行作为一个字段,然后打印您关注的任何记录的最后一个字段的第一个子字段:

$ awk -v RS= -F'\n' '/^Table 1/{split($NF,a," "); print a[1]}' file
3

$ awk -v RS= -F'\n' '/^Table 2/{split($NF,a," "); print a[1]}' file
2

答案 3 :(得分:-1)

更好的工具就是awk!
这是一个清晰易读的代码:

awk '{
    if(NR==1) {
        row=$0;
        next;
    }

    if($0=="") {
        $0=row;
        print $1;
    } else {
        row=$0;
    }
} END {
    if(row!="") {
        $0=row;
        print $1;
    }
}' input.txt