例如我的文件是这样的:
59 6 18 2014 169 7 14 2 7671912 7849744 201 4
60 6 19 2014 170 5 49 2 7671912 7849744 201 5
61 6 20 2014 171 6 8 2 7671912 7849744 201 6
62 6 23 2014 174 5 3 2 7671912 7849744 201 7
63 6 23 2014 174 7 17 2 7671912 7849744 201 8
64 6 24 2014 175 16 13 2 7671912 7849744 201 9
65 6 25 2014 176 8 20 2 7671912 7849744 201 10
10
1 1 49 6 16 2014 7 39 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 2 49 6 17 2014 13 15 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 3 49 6 18 2014 1 38 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 4 49 6 18 2014 7 14 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 5 49 6 19 2014 5 49 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
我需要打印单个令牌条目“10”的前一行,它应该是
65 6 25 2014 176 8 20 2 7671912 7849744 201 10
我怎样才能做到这一点?
答案1
您可以使用awk
:
awk 'NF == 1 { print LAST } { LAST=$0 }' < datafile
这会保存文件 ( LAST=$0
) 的每一行,并且当一行只有一条记录时(NF == 1
-NF
粗略地说,是该行上的标记数),它会打印保存的前一行。
答案2
如果该标记仅出现一次,则可以使用 GNU 执行此操作grep
:head
grep -x -B 1 10 file | head -n 1
指示打印匹配行及其之前的行-B 1
。grep
使用该-x
选项,匹配实际上grep 10
的行(而不是x
10
含有 10
)。最后,head -n 1
仅打印结果行的第一行。
答案3
sed
您可以使用sed
:
sed -e '/^10$/{x;p;}' -e 'x;d' < datafile
解释:
该地址/^10$/
与包含 10 的行相匹配。匹配时,将运行以下一系列命令,{x;p;}
该命令将x
保留空间与模式空间交换 ( ),然后打印 ( p
) 模式空间。
由于脚本的其余部分,保留空间包含前一行。对于文件的每一行,将x
保留空间与模式空间交换 ( ),然后删除 ( d
) 模式空间中的所有内容。
与第一个命令不同,第一个命令有一个地址前缀,导致它仅在看到第 10 行时才匹配,而这些命令没有前缀,因此会匹配文件的每一行。最终结果是,我们继续将看到的最后一行放入保留空间,而我们删除模式空间的事实意味着,当我们看到 10 时,除了显式输出之外没有其他输出。