特定の文字列に基づいて単一のファイルを別のファイルに分割する

特定の文字列に基づいて単一のファイルを別のファイルに分割する

次の項目を含むファイルがあります。

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

これにより、4つのファイルが生成されます。

最初の正規表現はvaで始まり、数字1、2、3が後にない行だけが一致します(この行は別のファイルに移動するため)。正規表現と一致しない行は削除されます。

以下と同じsed

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

このコマンドは、w現在sedの行を指定されたファイルに書き込みます。

そしてシェルループを使用してください(あなたは本物これを使用したい):

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

おすすめ記事