awk - 用键分隔行并存储在不同的文件中

如何在文本文件中分离(获取)十六进制数字键相关的整行和DEBUG的整行,然后存储在不同的文件中,其中键是这种格式:“[uid key]”? 即忽略任何不是 DEBUG 的行。

in.txt:

  [ uid 28fd4583833] DEBUG web.Action
  [ uid 39fd5697944] DEBUG test.Action
  [ uid 56866969445] DEBUG test2.Action
  [ uid 76696944556] INFO  test4.Action
  [ uid 39fd5697944] DEBUG test7.Action
  [ uid 85483e10256] DEBUG testing.Action

输出文件命名为“out”+ i +“.txt”,其中 i = 1、2、3、4。 即

out1.txt:

  [ uid 28fd4583833] DEBUG web.Action

out2.txt:

  [ uid 39fd5697944] DEBUG test.Action
  [ uid 39fd5697944] DEBUG test7.Action

out3.txt:

  [ uid 56866969445] DEBUG test2.Action

out4.txt:

  [ uid 85483e10256] DEBUG testing.Action

我试过:

awk 'match($0, /uid ([^]]+)/, a) && /DEBUG/ {print > (a[1] ".txt")}' in.txt

最佳答案

如果您愿意更改输出文件名以包含 key (坦率地说,这似乎比名称中的单计数器更有用),您可以这样做:

awk '/DEBUG/{print > ("out-" $3 ".txt")}' FS='[][ ]*'  in.txt

这会将所有与字符串 DEBUG 和 key 85483e10256 匹配的行放入文件 out-85483e10256.txt 等中。

如果你确实想保留单次计数器,你可以这样做:

 awk '/DEBUG/{if( ! a[$3] ) a[$3] = ++counter;
     print > ("out" a[$3] ".txt")}' FS='[][ ]*'  in.txt

基本上,想法是使用正则表达式 [][ ]* 作为字段分隔符,它匹配一串方括号或空格。这样,$1 是初始 [ 之前的文本,$2 是字符串 uid,而 $3 是关键。这将(应该!)正确地获取可能具有略微不同的空白的行的键。我们使用关联数组来跟踪哪些键已经被看到以跟踪计数器。但在输出文件名中使用 key 确实更干净。

https://stackoverflow.com/questions/72297811/

相关文章:

python - 为什么有些功能pass了

python - 在 Python 中用正则表达式替换 '(' 时出错

c - 如何从内存中正确分配结构

spring-webflux - Netty Http 客户端连接池

html - 对 div 标签内的 span 元素应用边距和在 div 标签内应用边距有什么区别?

javascript - 我如何在 react 中使用刷新 token

python - Python 何时从实例 __dict__ 返回到类 __dict__?

arrays - 将 + 或 += 与 array#map 一起使用?

r - 根据特定列中的数据框条目添加新列的最快方法是什么

c++ - 如何从析构函数返回变量