事前定義された行のセットに従ってテキストファイルを分割したい。
たとえば。ファイルがあります
a
b
c
d
e
f
そして、次の行のセットがあります(これらは、1つのファイル、複数のファイルなどに保存できますが、より便利です)。
1,2
3,6
5,4
ファイルを分割して、次のように3つのファイルを取得したい:
file1
a
b
file2
c
f
file3
e
d
承認された回答:
これがbash
です 入力ファイルの名前がinfileで、範囲がsplitsという名前のファイルに1行に1つずつ格納されていると仮定したスクリプト:
i=1
for range in $(< splits); do
sed -n "$(echo "$range" | cut -f1 -d, )p" infile > "file$i"
sed -n "$(echo "$range" | cut -f2 -d, )p" infile >> "file$i"
((i++))
done
これは単にsed
を使用します 範囲で指定された行を印刷し、各結果を新しいファイルとして保存します(作成されたファイルの名前はfile1 file2 file3など)。 sed
の2回の呼び出し 行の指定された順序を保持するために使用されます。
この単純なスクリプトではフォーマットやエラーのチェックは行われないことに注意してください。 file1は上書きされます。
while read
を使用した簡略化された代替手段(@muru提供) カットする代わりにbashに範囲を分割させる:
i=1
while IFS=',' read n1 n2
do
sed -n "$n1 p; $n2 p" infile > "file$i"
((i++))
done < splits
出力ファイルの行の順序が重要な場合(たとえば、行5、4!=4,5)、sed
ビットは、最初のスクリプトと同様に2つの別々の呼び出しに分割する必要があります。