だから私はbashを使ってファイルを読みます(改行、スペースやタブなし)。
このような:
aababcbbcbckqkkqkqhddhkehkjhqkjhsdk
skjhqkdjhqkzdhkzhdkjqzhdhqkjhzdkqzh
この例には改行文字がありますが、私が作業しているデータには何もありません...それで、技術的にすべてが「同じ行」にあると見なされることがわかりました(改行文字や改行文字がないため)。任意の区切り文字を使用してN文字すべてを読み取ろうとします。
while read -N129999 character; do
program "$character"
done < <(cat file | tr -d '\n')
(私は「猫の役に立たない用途」を知っています)
ここで使用する数字は、read
私が作業したときに見つけた最大値です。 (ファイルをより迅速に処理するため、この方法をお勧めします。)program
これは説明目的でのみ使用された例にすぎません。上記のデータから意図的に改行、タブ、スペースを削除しました。
今私が提供したものはうまくいきますが、上記より少ない数字を含むファイルの最後の部分ではうまくいきません。IFS
-nオプションに区切り文字が指定されている場合は続行できますが、文字範囲に収まらない残りのファイルを無視する代わりに...
(bash、sed、または他のposixツールから)その範囲に収まらない残りのファイル/入力を含めながら、すべてのN範囲の文字をどのように読みますか?
答え1
最後の行の末尾に改行文字が欠落しているテキストファイルを読み取ると、同じ問題が発生します。read
区切り文字を表示する前にファイルの末尾に到達するか、ここで必要な文字数を読み取れなかった場合はfalse状態を返します。つまり、読んでも何それの前に。ただし、出力変数を設定するので、nullでないことを確認できます。
$ printf abc | while read -N2 x || [ "$x" ] ; do echo "read: $x"; done ;
read: ab
read: c
その条件がない場合は、ループが終了した後に入力の最後の部分が出力変数に表示されることがわかります。
$ printf abc | ( while read -N2 x; do echo "read: $x"; done ; echo "finally: $x" )
read: ab
finally: c