␁で区切られたテキストストリーム部分を処理します。

␁で区切られたテキストストリーム部分を処理します。

ファイルストリームを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に変更することもできます。\001awk


SOHに設定することもできますが、RSここではレコードの先頭にSOHがあり、最後にレコード区切りawk文字が見つかると予想しているため、これは完全には適切ではありません。

おすすめ記事