我想写一个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?
答案 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