如何连接可变数量的行

如何连接可变数量的行

我有一个包含以下功能名称和可变数量用户名的文件:

特征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

相关内容