【问题标题】:grep a word of some length and pick the n lines below it untill the same length word is foundgrep 某个长度的单词并选择它下面的 n 行,直到找到相同长度的单词
【发布时间】:2017-08-16 16:36:53
【问题描述】:

我在 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

【问题讨论】:

  • 你可以尝试用换行符分割你的字符串,然后在数组中寻找你需要找到的字符串,然后使用循环获取一些元素
  • your xml file: xmlstarlet sel -t -m "//X1/X2[X3='UAE']" -v 'X3' -n -v 'id' -n file.xml

标签: shell grep lines word


【解决方案1】:

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

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

简要说明,

  • 使用标志a 确定是否打印记录
  • length($0)==3,当且仅当$0=="UAE",设置a=1,否则a=0
  • 如果是 length($0)!=3,请保留 a 以前的样子。

【讨论】:

  • Nice ++(这是填充物)。
【解决方案2】:
$ awk -v s=UAE '$0==s||p{p=(length($0)==length(s)?$0==s:p)}p' file
UAE
44444444444444444444444444
55555555555555555555555555
77777777777777777777777777
66666666666666666666666666
88888888888888888888888888
UAE
AAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDD

解释:

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

编辑: awk 中的另一个:

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

【讨论】:

    猜你喜欢
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 2018-09-28
    相关资源
    最近更新 更多