0

我想编写一个 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

4 回答 4

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
于 2013-04-17T18:50:37.873 回答
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 开始,我们将当前行推入保持空间,获取下一行并查看它是否为空白或文件末尾,如果不是,我们返回 :next,将当前行推入保持并获取另一行。如果它是空白或 EOF,我们跳到 :last,将保留空间(表格的最后一行)拉入模式空间,删除除第一个字段之外的所有字段并打印它。

于 2013-04-17T19:19:09.890 回答
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
于 2013-04-18T02:32:30.210 回答
-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
于 2013-04-17T18:56:58.720 回答