如何将file1中NAME/AGE数据转换为指定格式并完整写入file2?
批量转换NAME/AGE文本为竖线分隔格式
你的需求是把file1中逐行的NAME和AGE条目,转换成file2里的表头+每行NAME|AGE的格式,原来的命令只能处理前两行,这里给你几个高效的完整解决方案:
方法1:用awk(最推荐,简洁高效)
awk天生适合处理这种成对的行数据,一行命令就能搞定:
awk 'BEGIN{print "NAME|AGE"} /NAME/{n=substr($0,index($0,":")+1);gsub(/^ +| +$/,"",n)} /AGE/{a=substr($0,index($0,":")+1);gsub(/^ +| +$/,"",a);print n"|"a}' file1.txt > file2.txt
命令解释:
BEGIN{print "NAME|AGE"}:在处理文件前先打印表头/NAME/{...}:匹配到NAME行时,提取冒号后面的内容,并用gsub去掉内容前后的空格,把结果存在变量n里/AGE/{...}:匹配到AGE行时,同样提取并清理冒号后的内容存在a里,然后把n和a用竖线连接起来打印- 最后用
> file2.txt把结果直接写入目标文件(会覆盖原有内容,若要追加用>>)
如果觉得一行命令太长,也可以写成脚本文件convert.awk:
BEGIN { print "NAME|AGE" } /NAME/ { name = substr($0, index($0, ":") + 1) gsub(/^[[:space:]]+|[[:space:]]+$/, "", name) # 去除前后所有空白字符(包括空格、制表符) } /AGE/ { age = substr($0, index($0, ":") + 1) gsub(/^[[:space:]]+|[[:space:]]+$/, "", age) print name "|" age }
然后执行:
awk -f convert.awk file1.txt > file2.txt
方法2:用Shell循环+sed
如果更习惯基础Shell命令,也可以用逐行读取的循环:
# 先写入表头,覆盖原有file2内容 echo "NAME|AGE" > file2.txt # 每次读取两行(NAME行和AGE行为一组) while IFS= read -r name_line && IFS= read -r age_line; do # 提取NAME行中冒号后的内容(忽略冒号前后的空格) name=$(echo "$name_line" | sed 's/NAME[[:space:]]*:[[:space:]]*//') # 提取AGE行中冒号后的内容 age=$(echo "$age_line" | sed 's/AGE[[:space:]]*:[[:space:]]*//') # 写入file2 echo "$name|$age" >> file2.txt done < file1.txt
命令解释:
IFS= read -r:避免读取行时丢失开头/结尾的空格,同时不转义特殊字符sed 's/NAME[[:space:]]*:[[:space:]]*//':匹配NAME后跟任意空格、冒号、任意空格,然后把这部分替换为空,剩下的就是我们要的名字
为什么原来的命令不行?
你之前用的head -2 file1.txt | nl | tr '\n' '|'有几个问题:
head -2只取前两行,没法处理全部数据nl会给每行加行号,这是多余的,反而会破坏数据tr '\n' '|'是把所有换行换成竖线,会把所有行连成一长串,而不是每两行合并成一个NAME|AGE条目
内容的提问来源于stack exchange,提问作者volmokirti
相关产品推荐
相关产品推荐

