【问题标题】:Ubuntu, Bash, awk, regular expressions -> find all the [numbers] in text file and print themUbuntu、Bash、awk、正则表达式 -> 在文本文件中查找所有 [数字] 并打印它们
【发布时间】:2016-04-13 17:24:25
【问题描述】:

我想在“[]”括号中找到每个数字,并在文本文件中打印它们的所有外观(行号)。

例如我得到这样的文本文件:

texttexttext[1] textetxtetete[2]
[1]textextetetete[3]
texttexttext[2]
texttexttext
text[3]text[1]

输出应该是这样的:

[1] = lines : 1 2 5
[2] = lines : 1 3
[3] = lines : 2 5

这是我到目前为止所做的:

#!/bin/bash
cat $1 | awk -F'[/[/] ]' '{     #[] as file separators
for (i=1;i<=NF;i++)             #for every part of line
  {
  if ($i ~ "[0-9]+")            #if its number
    {
      #save it somehow
    }
}}'

脚本找到所需的数字,但现在我想以某种简单的方式保存它,以及它的行号(NR 变量)。我应该尝试使用数组吗?我至少需要二维数组,但它们在 bash 中有点问题。有没有更好的办法?

【问题讨论】:

  • awk 不支持真正的多维数组,但gawk 支持(尽管有一些问题)。除非您想将多个命令串在一起,否则您需要使用具有健全的多维数组支持的东西。

标签: regex linux awk


【解决方案1】:

这是一个使用 awk(和一维数组)的解决方案

awk -F"[\],\[]" '{
for (i=1;i<=NF;i++)
  {
  if ($i ~ "[0-9]+")
    {
      arr[$i]=arr[$i]" "NR
    }
   }
} 
END{for(i in arr){print "["i"] lines : " arr[i]}}' t.txt

输出:

[1] lines :  1 2 5
[2] lines :  1 3
[3] lines :  2 5

备注: 正则表达式 [0-9]+ 也匹配包含字符的字符串(例如,4a)。如果您的输入文件包含 [45a] 之类的内容,并且您想排除它,请将您的正则表达式更改为 ^[0-9]+$

【讨论】:

  • 哇。慢拍。。你得到了一个赞成票,它的顺序不对,但谁在乎,我要保存这个!
  • @JavierBuzzi:谢谢!
【解决方案2】:

这是使用 gawk 的 FPATsorted_in 的变体:

    BEGIN { # define fields via FPAT and sort order 
        FPAT="\[[0-9]+\]" 
        PROCINFO["sorted_in"] = "@ind_str_asc"
        }
    { for (i = 1; i <= NF; i++) occ[ $i ] = occ[ $i ] " " FNR }

    END { for( i in occ ) printf( "%s = lines : %s\n", i, occ[ i ] ) }

【讨论】:

    猜你喜欢
    • 2017-11-05
    • 1970-01-01
    • 2022-07-07
    • 2019-11-06
    • 1970-01-01
    • 2012-11-30
    • 2019-03-19
    • 2011-04-02
    • 1970-01-01
    相关资源
    最近更新 更多