询问有关使用 awk 从文件中提取具有特定行的文本块的说明。
该文件具有以下结构:
<Information>
<CID>_whole_number_A_</CID>
<string>_text_that_is_not_useful_</string>
<string>_text_that_is_not_useful_</string>
<string>_PATTERN_A_</string>
<string>_text_that_is_not_useful_</string>
</Information>
<Information>
<CID>_whole_number_B_</CID>
<string>_PATTERN_B_</string>
<string>_text_that_is_not_useful_</string>
<string>_text_that_is_not_useful_</string>
<string>_text_that_is_not_useful_</string>
<string>_text_that_is_not_useful_</string>
<string>_text_that_is_not_useful_</string>
</Information>
想 awk 将以下模式发送到新文件。
<Information>
<CID>_whole_number_A_</CID>
<string>_PATTERN_A_</string>
</Information>
<Information>
<CID>_whole_number_B_</CID>
<string>_PATTERN_B_</string>
</Information>
关于数据的注释:
- 该文件有 300,000 多个 CID 项;每个都用一个唯一的整数标识。
- PATTERN(_PATTERN_A_、_PATTERN_B_ 等)的格式为 UNII-<10 个字符>。例如:UNII-4J4Z8788N8 或 UNII-12L95QD6KV。
- 不是每个 CID 都有一个 UNII。
关于我的环境的注意事项:
- 我在 Windows 7 下工作并使用 GnuWin32 实用程序
所以,用英语改写:
在 FILE_1 中
找到每个具有 UNII 的 CID
将过滤后的结果发送到 FILE_2
提前感谢您的指示。
==================================================== =======================
好吧,我做错了什么。
在我的第一个实现中,程序只返回“记录开始”和“结束标记”,即:
<Information>
</Information>
以下是我如何应用你的指示。
首先,我运行的是 Windows,所以改为 FS="\r\n"
第一个正则表达式是UNII,所以改为/UNII/。
第二个正则表达式是您在说明中使用的 CID。我在那里没有做任何改变。
对于 PATTERN 的第二个实例,我改为 /UNII/。
这是我的替代品的外观:
BEGIN {
RS="<Information>"
FS="\r\n"
}
/UNII/ {
print RS
for (i=1;i<NF;i++) {
if ($i ~ /CID/ || $i ~ /UNII/) {
print $i
}
}
print "</Information>"
}
因为我使用的是 Windows,所以我使用完整路径来执行 GnuWin32 实用程序和读/写数据。所以我的 .bat 文件如下所示:
C:\bin\awk -f C:\bin\script.awk < C:\Users\Owner\data\input_file.txt > C:\Users\Owner\data\output_file.txt
我究竟做错了什么?
==================================================== ===============================这里是示例数据:
<Information>
<CID>1</CID>
<Synonym>Acetyl carnitine</Synonym>
<Synonym>O-Acetyl-L-carnitine</Synonym>
<Synonym>Ammonium, (3-carboxy-2-hydroxypropyl)trimethyl-, hydroxide, inner salt, acetate, DL-</Synonym>
<Synonym>UNII-07OP6H4V4A</Synonym>
<Synonym>_20+_more_</Synonym>
</Information>
<Information>
<CID>10006</CID>
<Synonym>HYDANTOIN</Synonym>
<Synonym>UNII-I6208298TA</Synonym>
<Synonym>53760_FLUKA</Synonym>
<Synonym>NSC9226</Synonym>
<Synonym>_20+_more_</Synonym>
</Information>
<Information>
<CID>10007</CID>
<Synonym>Lucofen SA</Synonym>
<Synonym>461-78-9</Synonym>
<Synonym>EINECS 207-314-9</Synonym>
<Synonym>STK664067</Synonym>
<Synonym>DEA No. 1645</Synonym>
<Synonym>UNII-NHW07912O7</Synonym>
<Synonym>CHEMBL1201269</Synonym>
<Synonym>HMS1376E21</Synonym>
<Synonym>_20+_more_</Synonym>
</Information>