从批量数据中搜索字符串

时间:2016-03-23 09:02:43

标签: regex text awk pattern-matching

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

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

无法使其发挥作用。请帮忙。

3 个答案:

答案 0 :(得分:0)

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

<p>The colour is: <span id=hai></span></p>
<button id="btn" onclick="change()">Change!</button>

答案 1 :(得分:0)

非常像Manishs回答:

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

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

答案 2 :(得分:0)

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]