ファイルストリームをstdin
より小さな部分に分割し、各部分をスクリプトに渡す方法、
次のような大容量ファイルがありますstdin
。
␁HeadingHere
abcd
abcd
␁Different Title
bcde
bcde
{a lot longer}
␁Different again!
cdef
cdef
この部分を渡す方法を探しています。./script.sh
これは次のタスクをシミュレートします。
cat <<EOF | ./script.sh
␁HeadingHere
abcd
abcd
EOF
cat <<EOF | ./script.sh
␁Different Title
bcde
bcde
{a lot longer}
EOF
cat <<EOF | ./script.sh
␁Different again!
cdef
cdef
EOF
各部分は分解して識別できます␁
。
xargs
似たようなものを使ってやろうと思ったのですが、xargs -d '\01' -n1 echo
偶然出会いました。xargs: argument line too long
理想的には、スクリプトは以下と互換性がposix
あります。
ベストアンサー1
これらの部分を別々のファイルに分割して1つずつ処理できます。これはoutfile.1
次の結果をもたらします。
awk '/^␁/ { count++ } { print > "outfile." count } ' < file
または、awk
部品を1つずつコマンドにパイプすることもできます。
awk 'BEGIN {command = "./script.sh"} /^␁/ { close(command) }
{ print | command } ' < file
私はタイトルを始めるために上で文字通りU + 2401表記を使用しました。なぜなら、それはコピーペーストを介して得たからです。コマンドラインで使用したので、\01
これらのコマンドがある場合は、xargs
コードでSOHチルダを実際のSTART OF HEADINGに変更することもできます。\001
awk
SOHに設定することもできますが、RS
ここではレコードの先頭にSOHがあり、最後にレコード区切りawk
文字が見つかると予想しているため、これは完全には適切ではありません。