3

データ ファイルと位置のリストを含むファイルがあり、データ ファイルのチャンクからファイルを生成したいと考えています。例:

$ cat data
abcdefghijkl
$ cat positions
0,2
5,8
$ cutter positions data
abcfghi

私の架空の「カッター」のように機能する(Linux)シェルコマンドはありますか?「位置」の特定の形式は重要ではありません。「位置」で指定されたチャンクは昇順であり、重複していないと想定できます。位置がバイトではなく行をカウントする追加の「カッター」モードがある場合があります。

私はそのようなプログラムを自分で簡単に実装できましたが、そのようなプログラムがすでに存在するという直感を持っています。

4

3 に答える 3

4

パラメータ展開からのbashの部分文字列抽出を使用し、positions指定されたファイル形式を使用するだけです:

data=$(< data)    # read the entire file into a variable
while IFS=, read start stop; do
    printf "%s" "${data:$start:((stop-start+1))}"
done < positions
echo

出力

abcfghi

データ ファイルが複数の行にまたがる場合は、改行文字を考慮して位置ファイルに注意する必要があります。

この方法では、データ ファイルをメモリに読み込む必要はありません。

#!/bin/bash
exec 3<data
exec 4<positions
pos=0
while IFS=, read start stop <&4; do
    ((nskip = start - pos))
    ((nkeep = stop - start + 1))
    ((pos += nskip + nkeep))
    ((nskip > 0)) && read -N $nskip <&3
    read -N $nkeep <&3
    printf "%s" "$REPLY"
done
echo
于 2013-01-01T16:56:43.653 に答える
3

cut -c固定幅の列を指定できるようになります。これは、探しているもののようです。

$ echo "abcdefghijkl" | cut -c 1-3,6-9
abcfghi

文字位置は 0 ではなく 1 から始まることに注意してください。個々の列はコンマを使用して指定できます (例: cut -c 1,3,5,7)。範囲はダッシュを使用して指定できます。cut -c 2-8

于 2013-01-01T17:15:12.560 に答える
2

Barton Chittendenがコマンド置換を追加して指摘しているように、cutこれを行うことができます。

$ cut -c $(cat positions) data
abcfghi

「位置」の特定の形式は重要ではありません。

期待通りのポジションのフォーマットを作成したcutので、余分な処理は必要ありませんでした。

$ cat data
abcdefghijkl

$ cat positions
1-3,6-9

ファイルに関数cutter追加することで、これをコマンドに変えることができます~/.bashrc

function cutter ()
{
     $ cut -c $(cat "$1") "$2"
}

実行してから、必要に応じてsource ~/.bashrc使用できます。cutter

$ cutter positions data
abcfghi

リダイレクトを使用して、出力を次のように保存しますnewfile

$ cut -c $(cat positions) data > newfile

$ cutter positions data > newfile
于 2013-01-01T15:56:54.643 に答える