我有一个包含以下功能名称和可变数量用户名的文件:
特征1
用户1
用户2
特征2
用户3
我希望能够将用户名移动到与功能名称相同的行(与 vi join 命令的行类似)。功能名称以大写字母开头,用户名以小写字母开头。有办法做到这一点吗?
答案1
这很容易sed
:
sed ':a;N;$!ba;s/\n\+\([a-z]\)/ \1/g;'
简要描述一下它的工作原理:
:a;N;$!ba;
将所有行添加到匹配模式中。我们需要它在下一步中删除所有换行符。
s/\n\+\([a-z]\)/ \1/g;
将删除之前的所有换行符user*
并保存之前的换行符Feature*
。顺便说一下,它也可以使用
tr '\n' ' ' | sed 's/ \([A-Z]\)/\n\1/g'
$ cat test_file
Feature1
user1
user2
Feature2
user3
Feature2
user3
user3
ouser3
user3
$ sed ':a;N;$!ba;s/\n\+\([a-z]\)/ \1/g;' test_file
Feature1 user1 user2
Feature2 user3
Feature2 user3 user3 ouser3 user3
答案2
在 AWK 中这非常简单:
awk '/^[[:upper:]]/ {if (line) {print line}; line = $0} /^[[:lower:]]/ {line = line " " $0} END {if (line) {print line}}'
答案3
您需要在写入数据之前对其进行分块。类似以下伪代码(您需要自己将其转换为正确的 BASH 语法)。
out_line=""
for in_line in $(cat $file); do
if $(echo in_line | egrep ^Feature) != ""
echo $out_line >> $out_file
out_line="$in_line"
else
out_line="$out_line $in_line"
fi
done
echo $out_line >> $out_file