Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用bash或python从文本文件中提取子结构_Python_Bash - Fatal编程技术网

使用bash或python从文本文件中提取子结构

使用bash或python从文本文件中提取子结构,python,bash,Python,Bash,我有一个巨大的文本文件,其结构如下: SET TAG1 ... ... SET ... SET TAG2 ... ... SET ... ... 我想提取特定标签(即TAG54)的单个“子结构”,即 SET TAG54 ... ... SET 对于给定的标签i,每个子结构始终包含: 第一行:设置 第二行:TAG_i(在本例中为TAG54) 任意数量的行 最后一行:SET 我想知道做这件事的最佳方法是什么,无论是在bash还是python中,因此对于给定的标记,可以“提取”这个子结构 谢谢这里

我有一个巨大的文本文件,其结构如下:

SET
TAG1
...
...
SET
...
SET
TAG2
...
...
SET
...
...
我想提取特定标签(即TAG54)的单个“子结构”,即

SET
TAG54
...
...
SET
对于给定的标签i,每个子结构始终包含:

第一行:设置 第二行:TAG_i(在本例中为TAG54) 任意数量的行 最后一行:SET

我想知道做这件事的最佳方法是什么,无论是在bash还是python中,因此对于给定的标记,可以“提取”这个子结构


谢谢

这里有一种Python方法:您将打开的文件句柄作为第一个参数传递,将标记号作为第二个参数传递,然后作为结果返回相关行的列表(包括换行符),如果在文件中找不到标记,则返回空行:

def lookfor(f, tagnum):
  tag = 'TAG%s\n' % tagnum
  for line in f:
    if line == tag:
       break
  else: # file finished, tag not found
    return []
  result = ['SET\n', tag]
  for line in f:
    result.append(line)
    if line == 'SET\n':
        break
  return result

这应该是相当好的表现。如果您想要其他形式的参数和/或结果,当然,相应地调整也不难。

如果您的系统的
grep
支持
-p
for perl regexp:

grep -P 'SET\nTAG54\n[.\n]*\nSET' file.txt
目瞪口呆:

如果使用shell脚本编写,请使用
-v
将shell变量传递到
awk
。乙二醇

#!/bin/bash
read -r -p "what's your tag? " tag
awk -vRS="SET" -vt="$tag" '$0~tag{print RT$0RT}' file

这不是一个很好的解决方案,但是您可以在python中使用my bad regex:/TAG\d++(.++)SET/gsm有一种更好的方法来换行,但是我使用的regex工具不喜欢它们。您好,您的方法非常好而且简单!我忘了提到,我还需要在文件的开头和结尾有“SET”的行,但我会自己做。谢谢,没用。你能告诉我每个部分都做什么吗?非常感谢
grep
是一个搜索工具;
-P
选项使
grep
使用perl类型的regexp(您的系统可能不支持
-P
'SET\nTAG54\n[.\n]*\nSET'
是要匹配的正则表达式:
SET
后跟一个换行符,后跟
TAG54
和一个换行符,然后是任意字符和/或换行符(
.\n]
)的任意数(
*
),一个换行符和
SET
file.txt
是要搜索的文件名。
BEGIN {
  state=0
}

state==0 && $0=="TAG54" {
  print "SET"
  state=1
}

state==1 {
  print
}

state==1 && $0=="SET" {
  exit
}
$ awk -vRS="SET" '/TAG54/{print RT$0RT}' file
SET
TAG54
...
...
SET
#!/bin/bash
read -r -p "what's your tag? " tag
awk -vRS="SET" -vt="$tag" '$0~tag{print RT$0RT}' file