Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash cat文件-如果存在”;字;打印“上方的行”;字;_Bash_Awk_Sed_Scripting - Fatal编程技术网

Bash cat文件-如果存在”;字;打印“上方的行”;字;

Bash cat文件-如果存在”;字;打印“上方的行”;字;,bash,awk,sed,scripting,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)prin

我有一些文本文件,例如

######## 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–如:
    sed-n'1、/Country/p'file.txt
    –如上所述
有人能帮我吗?:)

使用
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
  • -b1
    打印一行前导上下文
  • -v
    --反向匹配
  • “Country\\\124;--”
    \\124;
    被转义或
这可能适合您(GNU-sed):

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

sed -n '/Country/{x;p};x' tmp
-n->禁止自动打印图案空间

x->交换图案并保留空间,以便前一行位于图案空间缓冲区中

p->打印前一行(保留空间是多少)


;x->如果行中不包含国家,则交换保持和模式并再次运行。

耶稣基督如此平庸:D-谢谢你@heemayl!:)不客气。仅供参考,尽管POSIX说您需要一个
在一个动作块之后,你不需要。因为大多数awk脚本不需要这样做,所以如果需要的话,它就会中断。
sed -n 'N;/\n.*Country/P;D' file
sed -n '/Country/{x;p};x' tmp