GNU/Linux >> Linux の 問題 >  >> Ubuntu

事前定義された行のセットに基づいてファイルを分割しますか?

事前定義された行のセットに従ってテキストファイルを分割したい。
たとえば。ファイルがあります

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つの別々の呼び出しに分割する必要があります。


Ubuntu
  1. IsoファイルからUbuntuをインストールする方法は?

  2. Grubファイルを更新するためのSedの使用法?

  3. 複数のファイルテキストをSedに置き換えますか?

  1. カップ印刷でアカウント追跡を設定する場所は?

  2. CentOSで仮想ホストを設定する

  3. Linux での sed コマンドの例

  1. sed:コマンドが見つかりません

  2. 指定された行数ごとにCSVファイルを分割する方法は?

  3. unix - 巨大な .gz ファイルを行ごとに分割する