如何用Unix单行命令将首字段移至可变长度后续字段末尾?
调整文件字段顺序的Unix单行命令
原文件格式:
id1 str1 str2 .. strn id2 str1 str2 .. strm
每行首字段为ID,后续字符串数量不固定,需要转换为以下格式:
str1 str2 .. strn [id] str1 str2 .. strm [id]
awk实现方案
下面提供几种实用的awk写法,解决提取首字段后所有内容的问题:
- 用正则替换移除首字段
awk '{sub(/^[^ ]+ /, ""); print $0 " [" $1 "]"}' file
sub(/^[^ ]+ /, "")会匹配行首第一个字段(包含其后的空格)并替换为空,剩下的就是所有后续字段,直接拼接带括号的ID即可。
- 循环拼接后续字段
awk '{rest=""; for(i=2;i<=NF;i++) rest=rest $i " "; sub(/ $/, "", rest); print rest " [" $1 "]"}' file
通过循环从第2个字段开始拼接所有内容,最后用sub(/ $/, "", rest)移除拼接后末尾多余的空格,再添加ID部分。
- 重定义字段后截取内容
awk '{id=$1; $1=""; print substr($0,2) " [" id "]"}' file
先把首字段存到变量id中,将$1设为空后,$0会自动变成从第2个字段开始的内容(但开头会多一个空格),用substr($0,2)去掉开头的空格,再拼接ID即可。
内容的提问来源于stack exchange,提问作者kloop
相关产品推荐
相关产品推荐

