如何用awk自动拼接文件首字段后的所有字段(以|分隔)
解决:将每行首个字段后的所有字段用
|拼接 输入示例
ID1 as;uh;2 ID2 uh;3 jk PASS ID3 PASS ID4 as;uh;PASS kk;3 rt ID5 as ID6 PASS PASS uh 3;4 ID7 jk;34 hy
期望输出
ID1 as;uh;2 ID2 uh;3|jk|PASS ID3 PASS ID4 as;uh;PASS|kk;3|rt ID5 as ID6 PASS|PASS|uh|3;4 ID7 jk;34|hy
原代码问题分析
你之前的awk代码硬编码了字段位置(仅处理到$4),循环删除字段的逻辑也无法适配任意数量的后续字段,自然没法处理字段数超过15的行。
两种可行的awk实现方法
方法1:循环拼接字段
awk '{ # 初始化结果为第二个字段 merged = $2 # 从第三个字段开始循环拼接 for (i = 3; i <= NF; i++) { merged = merged "|" $i } # 输出第一个字段和拼接后的结果(OFS设为空格保持格式) print $1, merged }' OFS=" " input.txt
逻辑说明:遍历从第3个到最后一个字段,逐个追加|和字段内容,最后将首个字段与拼接结果一起输出,适配任意字段数的行。
方法2:利用字符串替换简化操作
awk '{ # 获取从第二个字段开始的所有内容 rest_part = substr($0, index($0, $2)) # 将内容中的空格替换为| gsub(/ /, "|", rest_part) # 输出结果 print $1, rest_part }' input.txt
逻辑说明:通过substr截取首个字段之后的全部内容,再用gsub把其中的空格统一替换成|,实现快速拼接,代码更简洁。
内容的提问来源于stack exchange,提问作者Jeni
相关产品推荐
相关产品推荐

