如何检查多行上属于可变大小行块的多个条件并返回主lin

2024-05-16 06:27:48 发布

您现在位置:Python中文网/ 问答频道 /正文

基本上我的文本文件是这样的。你知道吗

 **A: lorem ipsum verade(unique)**
 a: asd
 b: asd

 c: alsd
 d: def

**B: korem ipsum vladmir(unique)**
 c: fdh
 e: asd

**C: lorum ipsum vladmir(unique)**
 a: asd
 b: asd

 d: def
 e: asd

正如我们在这里看到的,让我们说示例.txt有3个主条目(A、B、C)有多个数据。 我的问题是我能不能检查A的多个条件,例如,如果A:asd和d:def,我要A,B,C的所有条目。所以输出应该是A和C。 基本上,我想知道如何检查多行,同时保持跟踪行更早。 我希望我成功了明白,只是要记住这是一个巨大的文件,所以如果可能的话,需要避免多个循环。你知道吗


Tags: txt示例def条目unique文本文件ipsumlorem
3条回答

在AWK中:

  1. 您应该将主条目中的所有行存储在一个数组中。你知道吗
  2. 对于a:asd或d:def为变量添加1的每个选中行(假设为“counter”)
  3. 如果遇到新的主条目打印数组,如果计数器等于2,则清除计数器和数组。你知道吗

如果要搜索的字符串分别分配给“v1”和“v2”

$ v2="a: asd"; v1="d: def"
$ awk -v v1="$v1" -v v2="$v2" '/\*\*.*\*\*/{s=substr($0,match($0,/\*\*.\:/)+2,1);next}{a[s]=a[s] $0}END{for(i in a)if(match(a[i],v1)&&match(a[i],v2))print i}' test.txt
A
C

一个衬垫可以按下面的块扩展

$ cat awk-script
/\*\*.*\*\*/{
  s=substr($0,match($0,/\*\*.\:/)+2,1);
  next
}
{
  a[s]=a[s] $0
}
END{
  for(i in a)
    if(match(a[i],v1)&&match(a[i],v2))
      print i
}

$ awk -v v1="$v1" -v v2="$v2" -f awk-script test.txt
A
C

简要说明

  • /\*\*.*\*\*/:搜索主要条目
  • s=substr($0,match($0,/\*\*.\:/)+2,1):将主条目的值赋给's'
  • a[s]=a[s] $0:分配属于每个主条目的记录
  • match(a[i],v1)&&match(a[i],v2):检查“v1”和“v2”是否与每个主条目中的值匹配。你知道吗

这可能适用于您(GNU-sed):

sed '/^\s*\*\*/{:a;x;//!bb;/a: asd/!bb;/d: def/!bb;p;:b;x;h;d};H;$!d;ba' file

将多行集合存储在保留空间中。在开始一个新的收集之前,检查保留空间,如果它符合要求就打印出来。在文件末尾,最后检查一次保留空间。你知道吗

集合的开始由以**(或**开头并带有一些前导空格)的行表示。为了打印集合,它必须包含字符串a: asdd: def,否则它是一个错误的集合,最好忘记。所有其他行都可以附加到当前集合。你知道吗

相关问题 更多 >