grep 一个一定长度的单词并选择它下面的 n 行,直到找到相同长度的单词

grep a word of some length and pick the n lines below it untill the same length word is found

我在 unix 环境中有一个包含数据的文本文件,我正在使用 shell 脚本对该文件执行一些操作以获取一些特定数据。文件数据是这样的:

USA
11111111111111111111111111
22222222222222222222222222
33333333333333333333333333
UAE
44444444444444444444444444
55555555555555555555555555
77777777777777777777777777
66666666666666666666666666
88888888888888888888888888
USA
99999999999999999999999999
10101010101010101010101010
20202020202020202020202020
50050505050005050505050505
USA
20020202022222020222220202
30303333033030333030303330
UAE
AAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDD
NAE
DDDDDDDDDDDDDDDDDDDDDDDDDD
EEEEEEEEEEEEEEEEEEEEEEEEEE
JJJJJJJJJJJJJJJJJJJJJJJJJJ
KKKKKKKKKKKKKKKKKKKKKKKKKK

我想获取阿联酋下方的数字。即我期待这样的输出: 预期输出:

UAE
44444444444444444444444444
55555555555555555555555555
77777777777777777777777777
66666666666666666666666666
88888888888888888888888888
UAE
AAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDD

您可以使用 awk 来实现您的目标,

$ awk 'length([=10=])==3{a=([=10=]=="UAE")?1:0}a' file

简要说明,

  • 使用标志 a 确定是否打印记录
  • length([=13=])==3时,当且仅当[=14=]=="UAE"时,设a=1,否则a=0
  • 如果 length([=15=])!=3,保持 a 以前的状态。
$ awk -v s=UAE '[=10=]==s||p{p=(length([=10=])==length(s)?[=10=]==s:p)}p' file
UAE
44444444444444444444444444
55555555555555555555555555
77777777777777777777777777
66666666666666666666666666
88888888888888888888888888
UAE
AAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDD

解释:

$ awk -v s=UAE '                          # pass the string as variable
    [=11=]==s||p {                            # enable p rinting if s tring matches
        p=(length([=11=])==length(s)?[=11=]==s:p) # non-matching samelength string disables p 
    }
    p' file

编辑: awk 中的另一个:

$ awk -v s=UAE '[=12=]==s||length([=12=])==length(s)&&[=12=]!=s&&p{p=[=12=]==s}p' file
UAE
44444444444444444444444444
55555555555555555555555555
77777777777777777777777777
66666666666666666666666666
88888888888888888888888888
UAE
AAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDD