求助:基于file1.txt匹配file2.txt第四列提取对应文本块的Shell脚本
问题背景
我有两个文件file1.txt和file2.txt,内容如下:
file1.txt内容
256 258
file2.txt内容
2.1 56.8 85.1 256 2.2 56.8 85.2 256 2.3 56.8 85.3 256 2.4 56.8 85.4 258 2.5 56.8 85.5 258
需求
提取file2.txt中第四列值与file1.txt中值匹配的行块(跳过file1.txt中的空行),生成如下格式的输出:
first_block 2.1 56.8 85.1 256 2.2 56.8 85.2 256 2.3 56.8 85.3 256 second_block 2.4 56.8 85.4 258 2.5 56.8 85.5 258
尝试的未完成脚本
#!/bin/sh for file in `cat file1.txt' ` do ndt=$file echo $ndt for #here unable to proceed done
解决方案
推荐使用awk处理,它天生适合列操作,无需嵌套循环,效率更高:
完整可运行脚本
#!/bin/sh awk ' # 处理第一个输入文件file1.txt,存储非空匹配值 NR == FNR { if ($0 != "") { keys[$0] = ++block_idx } next } # 处理第二个输入文件file2.txt { target = $4 if (target in keys) { # 首次匹配该块时输出标题 if (!printed[keys[target]]) { printf "%s_block\n", (keys[target] == 1 ? "first" : "second") printed[keys[target]] = 1 } print $0 } } ' file1.txt file2.txt
脚本逻辑说明
- 处理file1.txt:
NR == FNR仅在处理第一个文件时触发,跳过空行后,将每个有效值存入数组keys,并为其分配块序号(1、2...)
- 处理file2.txt:
- 提取第四列值,检查是否在
keys数组中 - 用
printed数组标记块标题是否已输出,避免重复打印 - 根据块序号输出对应标题,随后打印匹配行
- 提取第四列值,检查是否在
扩展说明
如果file1.txt包含更多匹配值,脚本会自动生成third_block、fourth_block等标题,无需修改代码。
内容的提问来源于stack exchange,提问作者user19520518
相关产品推荐
相关产品推荐

