如何使用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
相关产品推荐
相关产品推荐

