cat文件 - 如果存在“单词”在“单词”上方打印行

时间:2016-09-11 20:02:55

标签: bash awk sed scripting

我有一些文件,例如,

######## cat file.txt
aaaa

bbbb

cccc

dddd
From CN Country

eeee

ffff
From UK Country

gggg

............

现在,如果在文件中出现“国家”字样,则只打印该字词上方的行,例如,

####### some magic command print
dddd
ffff

我想我可以用它:

  • awk - 喜欢:awk '/Country/{found=0} {if(found) print} //{found=1}' file.txt - 无济于事,并且我知道这个选项的组合:/
  • sed - like:sed -n '1,/Country/p' file.txt - 如上所述

任何人都可以帮助我吗? :)

4 个答案:

答案 0 :(得分:3)

使用awk

awk '/Country/ {print previous}; {previous=$0}' file.txt

示例:

$ cat file.txt
aaaa

bbbb

cccc

dddd
From CN Country

eeee

ffff
From UK Country

gggg

$ awk '/Country/ {print previous}; {previous=$0}' file.txt
dddd
ffff

答案 1 :(得分:2)

这可能适合你(GNU sed):

sed -n 'N;/\n.*Country/P;D' file

使用类似grep的开关-n并在模式空间中读取两行,如果第二行包含单词Country则打印第一行。

答案 2 :(得分:1)

$ grep -B 1 Country foo|grep -v "Country\|--"
dddd
ffff
  • -B 1 打印1行主要上下文
  • -v --invert-match
  • "Country\|--" \|已转义或

答案 3 :(得分:0)

sed -n '/Country/{x;p};x' tmp

-n - >抑制模式空间的自动打印

x - >交换模式并保持空间,以便前一行位于模式空间缓冲区中。

p - >打印上一行(什么是保留空间)。

; x - >如果line不包含country,则交换hold和pattern并再次运行。