根据特定字符串将单个文件分成不同的文件

根据特定字符串将单个文件分成不同的文件

我有一个包含以下条目的文件

vdomain
v2host
v3server
v1adapter
vhost
v2domain
v1application

我想将所有这些条目分成 4 个不同的文件,例如

file1 :应包含以“v”开头的名称

vdomain
vhost

file2 :应包含以“v1”开头的名称

v1application
v1adapter

file3 :应包含以“v2”开头的名称

v2host
v2domain

file4 :应包含以“V3”开头的名称

v3server

答案1

使用awk

awk '/^v[^123]/ { print >"file1" }
     /^v1/ { print >"file2" }
     /^v2/ { print >"file3" }
     /^v3/ { print >"file4" }' inputfile

这将创建您的四个文件。

第一个正则表达式仅匹配以 a 开头且v后面不跟数字 1、2 或 3 的行(因为这些行将进入其他文件)。与任何正则表达式不匹配的行将被丢弃。

与以下内容等效sed

sed -n \
    -e '/^v[^123]/w file1' \
    -e '/^v1/w file2' \
    -e '/^v2/w file3' \
    -e '/^v3/w file4' inputfile

命令wsed当前行写入指定文件。

并使用 shell 循环(你不真的想用这个):

rm -f file[1234]
while read -r words; do
    case "$words" in
        v1*) printf '%s\n' "$words" >>file2 ;;
        v2*) printf '%s\n' "$words" >>file3 ;;
        v3*) printf '%s\n' "$words" >>file4 ;;
        v*)  printf '%s\n' "$words" >>file1 ;;
    esac
done <inputfile

这是几乎除了每个输入行后面的空格将被删除之外,其他相同,并且初始空格也将被忽略并删除。在这里,测试的顺序也很重要。

最后, with ed,其脚本与 with 所使用的脚本毫无疑问相同sed

cat <<ED_END | ed -s inputfile
/^v[^123]/w file1
/^v1/w file2
/^v2/w file3
/^v3/w file4
ED_END

相关内容