次の数百行のシーケンスを含むテキストファイルがあります。
B29。 B52。 84頃。 83頃。 94頃。 93頃。 61程度。 B38。 81頃。 92程度。 28頃。 c 37. 27頃。 lara@batcuter:~/.asd/a-new-way-of-stuying-go$ wc -l game7 271話
次のスクリプトは、テキストファイルを2つのファイルに分割します。 1 つは奇数行、もう 1 つは偶数行で構成し、2 つのファイルを while IFS ループに読み込み、各ファイルに 1 行ずつ印刷します。
#/bin/bash
#testing liquor-where-twin-twas-born
awk '{print>"line-"NR%2}' $@
while IFS= read -r lineA && IFS= read -r lineB <&3; do
echo "$lineA";
echo "$lineB"
done <line-1 3<line-0
残念ながら、あるファイルが他のファイルより1行長くなるため、与えられた内容は入力ファイルとまったく同じではありません。
lara@batcuter:~/.asd/a-new-way-of-stuying-go$testing-liquor game7 > テスト lara@batcuter:~/.asd/a-new-way-of-stuying-go$ diff テストゲーム 7 270a271 >ロ7.
明らかにファイルの長さは271行なので、半分に分割すると2つのファイルになります。 1つは136行、もう1つは135行です。違いがゼロになるようにIFS whileループを変更する必要があります。最初は使い方が役に立つとread ... || read ...
思いました。しかし実際には、これは他のすべての解決策が試したように出力を膨らませ、各項目間に複数の改行を挿入し、最後の行(ファイルから奇数行で終わる行)を削除します。
答え1
言うおすすめ||
彼は愚かだ。を使用すると、||
コードスニペットは最初にすべての行を読み、次にすべての行fileA
を読みます。なぜなら、真が返されるfileB
限り実行されないからです。代わりに、2回呼び出して戻り状態を保存してから戻り状態をテストしてください。read lineA
read lineB
read
while
IFS= read -r lineA; statusA=$?
IFS= read -r lineB; statusB=$?
[ $statusA -eq 0 ] || [ $statusB -eq 0 ]
do …
ファイルが使い果たされたかどうかを知る必要がある場合は、$statusA
ループ内でテストを続行できます(行の内容は空ですが空白行と区別できません)。$statusB