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
相关产品推荐
相关产品推荐

