You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:基于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

脚本逻辑说明

  1. 处理file1.txt:
    • NR == FNR仅在处理第一个文件时触发,跳过空行后,将每个有效值存入数组keys,并为其分配块序号(1、2...)
  2. 处理file2.txt:
    • 提取第四列值,检查是否在keys数组中
    • 用printed数组标记块标题是否已输出,避免重复打印
    • 根据块序号输出对应标题,随后打印匹配行

扩展说明

如果file1.txt包含更多匹配值,脚本会自动生成third_block、fourth_block等标题,无需修改代码。


内容的提问来源于stack exchange,提问作者user19520518

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:48:58