我需要搜索一个字符串(此处为数字),并使用 grep 或 awk 或任何东西打印它的标题或标题。
请检查这个例子:
输入文件内容:
#####
Production_Broad:
#####
678
544
#####
IGHTY_BBBT:
#####
1666
2515
2516
2517
2518
#####
Jaguar:
#####
280
#####
Loyalty:
#####
5179
#####
MC_Addr:
#####
544
577890
#####
erce_Ban_1:
#####
7455
5656
我想搜索数字“2515”,它给出了以下输出:
IGHTY_BBBT:
2515
如果我搜索“5179”,输出应如下所示:
Loyalty:
5179
答案1
你可以尝试这样的事情:
awk '{if(match($0,":")) header=$0; if($0 == 2516) printf("%s\n%s\n",header,$0)}' input_file.txt
其中“2516”是您要搜索的号码。
obs:我假设所有标签都以“:”结尾。
答案2
如果标头由这些行标识#####
,并且要搜索的 ID 列表位于文件中ids.txt
(每行一个),您可以执行以下操作:
awk '
!ids_processed{ids[$0]; next}
$0 == "#####" {getline header; getline; next}
$0 in ids {print header ORS $0}' ids.txt ids_processed=1 input.txt
例如,如果ids.txt
包含
2515
544
577890
在你的样本中,这将给出:
Production_Broad:
544
IGHTY_BBBT:
2515
MC_Addr:
544
MC_Addr:
577890
答案3
awk方法:
awk -v RS="#####" -v num=2515 '$0~/[0-9a-zA-Z_]+:/{
getline nl; if (nl~num){sub("\n", "", $0); printf("%s%d\n",$0,num)}}' file
输出:
IGHTY_BBBT:
2515
RS="#####"
-#####
视为记录分隔符
-v num=2515
- 包含搜索编号的变量
$0~/[0-9a-zA-Z_]+:/
- 捕捉标头线
getline nl
- 获取下一条包含数字的记录
if (nl~num)
- 如果搜索号码在一行号码内匹配