【问题标题】:Search strings from bulk data从批量数据中搜索字符串
【发布时间】:2016-07-10 11:34:01
【问题描述】:

我有一个包含许多文件的文件夹,其中包含如下文本:

blabla
chargeableDuration    00 01 03
...
timeForStartOfCharge    14 55 41
blabla
...
blabla
calledPartyNumber   123456789
blabla
...
blabla
callingPartyNumber   987654321

我需要这样的输出:

987654321 123456789 145541 000103

我一直在尝试以下 awk:

awk -F '[[:blank:]:=,]+' '/findstr chargeableDuration|dateForStartOfCharge|calledPartyNumber|callingPartyNumber/ && $4{
if (calledPartyNumber != "")
 print dateForStartOfCharge, "NIL"
dateForStartOfCharge=$5
next
}
/calledPartyNumber/ {
for(i=1; i<=NF; i++)
  if ($i ~ /calledPartyNumber/)
     break
print chargeableDuration, $i
chargeableDuration=""
}' file

无法让它工作。请帮忙。

【问题讨论】:

  • 数字总是在行尾吗?并且您是否还有其他数字不能匹配?如果您之前没有数字:^\D*(.+),如果:[\d ]+$

标签: regex text awk pattern-matching


【解决方案1】:

假设您有一个名为“test.txt”的文件,下面的 linux shell 命令将为您完成工作。

egrep -o "[0-9 ]{1,}" test.txt | tr -d ' \t\r\f' | sort -nr | tr "\n" "\t"

【讨论】:

  • 谢谢,但是它打印了许多其他列,而不是所需的 4 列。您可以增加过滤器以获取确切的标题吗?
【解决方案2】:

很像 Manish 的回答:

tac test_regex.txt | grep -oP '(?<=chargeableDuration|timeForStartOfCharge|calledPartyNumber|callingPartyNumber)\s+([^\n]+)' | tr -d " \t\r\f" | tr "\n" " "

唯一的区别是,您保留前面的顺序而不是对结果进行排序。因此,对于您的示例,两种解决方案都会产生相同的输出,但您最终可能会得到不同的结果。

【讨论】:

    【解决方案3】:
    awk '/[0-9 ]+$/{
        x=substr($0,( index($0," ") + 1 ) );
        gsub(" ","",x);
        a[$1]=x
    }
    END {
        split("callingPartyNumber calledPartyNumber timeForStartOfCharge chargeableDuration",b," ");
        for (i=1;i<=4;i++){
             printf a[(b[i])]" "
        }
    }'
    

    /[0-9 ]+$/ : 查找以数字结尾的行,用/不带空格分隔。

    x=substr($0,( index($0," ") + 1 ) ):获取$0中第一个空格匹配后的索引,并将第一个空格匹配后的子串(即数字)保存到变量x

    gsub(" ","",x):删除x中的空格

    a[$1]=x:创建一个数组a,索引为$0,并为其分配x

    END:

    split("callingPartyNumber calledPartyNumber timeForStartOfCharge chargeableDuration",b," "):创建数组b,其中索引 1、2、3 和 4 按您需要的顺序具有所需字段的值

    for (i=1;i<=4;i++){ printf a[(b[i])]" " } : for 循环获取数组a 中的值,索引为数组b[1],b[2],b[3]b[4] 中的值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多