You need to enable JavaScript to run this app. 如何使用awk按列查找首个非'-'字符并输出单行结果
优惠活动
大模型
产品
解决方案
定价
更多

如何使用awk按列查找首个非'-'字符并输出单行结果

实现方案

awk版本

首先利用-F ''将每行按单个字符拆分作为字段,再用数组存储每列第一个非破折号的字符即可,完整命令如下:

awk -F '' '{
    for(i=1; i<=NF; i++){
        # 仅当该列未存储过有效值时才判断赋值,保证取最上方的第一个非破折号字符
        if(res[i] == "" && $i != "-"){
            res[i] = $i
        }
    }
}
END{
    for(i=1; i<=NF; i++){
        # 未找到非破折号的列输出破折号
        printf "%s", res[i] ? res[i] : "-"
    }
    print ""
}' your_file.txt

说明:

  • -F '' 是GNU awk的特性,主流Linux发行版默认携带的awk都支持该参数,作用是把每个字符拆分为单独的字段
  • 数组res下标对应列号,仅在对应列无有效值时才更新,确保取到的是第一行出现的非破折号字符
  • END块遍历所有列输出,未赋值的位置默认输出破折号
    测试给出的两个示例完全符合预期,第一个输出thanks,第二个输出than-s。

Python版本

如果更习惯用Python实现,代码逻辑更直白,不需要额外处理字段拆分的问题:

with open("your_file.txt", "r", encoding="utf-8") as f:
    lines = [line.rstrip("\n") for line in f]
result = []
col_total = len(lines[0])
# 逐列遍历
for col_idx in range(col_total):
    for line in lines:
        current_char = line[col_idx]
        if current_char != "-":
            result.append(current_char)
            break
    else:
        # 循环正常结束说明该列全为破折号
        result.append("-")
print("".join(result))

内容的提问来源于stack exchange,提问作者Devon O'Rourke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 15:36:04