如何逐行读取文件并打印文件包含单个标记的前一行

如何逐行读取文件并打印文件包含单个标记的前一行

例如我的文件是这样的:

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 执行此操作grephead

grep -x -B 1 10 file | head -n 1

指示打印匹配行及其之前的行-B 1grep使用该-x选项,匹配实际上grep 10的行(而不是x10含有 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 时,除了显式输出之外没有其他输出。

相关内容