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

Linux Bash:如何匹配变量与字符集筛选周期表指定语言内容

处理元素周期表多语言文本的过滤需求

我有一个包含多语言元素名称的周期表文本文件,格式如下:

1 H 语言1的元素名称 语言2名称 语言3名称 等
2 He 语言1的元素名称 语言2名称 语言3名称 等
...

需求是移除所有非目标语言的内容,只保留每行的序号、元素符号和目标语言名称。比如输入行1 H Hydrogen Wasserstoff Hydrogène 氢,处理后要输出1 H 氢。

之前尝试编写多个Bash脚本(PeriodicTable1至PeriodicTable4)都没成功,核心问题是不知道如何将字符串和字符数组做匹配筛选。


解决方案

方法1:用awk按固定列或字符集提取

如果目标语言的名称在每行固定列(比如示例中中文在第5列),直接指定列输出:

# 保留第1、2、5列(序号、元素符号、中文名称)
awk '{print $1, $2, $5}' periodic_table.txt > filtered_table.txt

如果列位置不固定,但能通过字符集识别(比如中文的Unicode范围),用awk匹配字符:

# 保留序号、元素符号,以及包含中文字符的字段
awk '{
    printf "%s %s", $1, $2;
    for (i=3; i<=NF; i++) {
        if ($i ~ /[\u4e00-\u9fa5]/) {
            printf " %s", $i;
        }
    }
    print ""
}' periodic_table.txt > filtered_table.txt

方法2:Bash脚本结合字符匹配筛选

先定义目标语言的字符特征,逐行处理每个字段:

#!/bin/bash
# 匹配中文Unicode字符范围
TARGET_PATTERN='[\u4e00-\u9fa5]'

while read -r line; do
    fields=($line)
    # 先输出序号和元素符号
    result="${fields[0]} ${fields[1]}"
    # 遍历后续字段,筛选符合目标语言的内容
    for field in "${fields[@]:2}"; do
        if [[ $field =~ $TARGET_PATTERN ]]; then
            result="$result $field"
        fi
    done
    echo "$result"
done < periodic_table.txt > filtered_table.txt

方法3:结合tr和sed预处理后合并

先提取目标语言的内容,再和序号、元素符号合并:

# 提取所有中文名称到临时文件
tr -c '\n\u4e00-\u9fa5' '\n' < periodic_table.txt | sed '/^$/d' > chinese_names.txt
# 合并原文件前两列和中文名称
paste <(awk '{print $1, $2}' periodic_table.txt) chinese_names.txt > filtered_table.txt

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:10:59