範囲リストをファイルの値リストに効率的にマッピングする

範囲リストをファイルの値リストに効率的にマッピングする

私のファイルにはスコープで書かれた値が含まれており、それを一般的なリストに「マッピング解除」する必要があります。これを効率的に行うにはどうすればよいですか?

例:

141540000,141569999,1
147280000,147289999,0

第1列は範囲開始値であり、第2列は範囲終了値であり、第3列は範囲内の各数値に対応する一部のデータである。

私が達成したい結果の例:

141540000, 1
141540001, 1
141540002, 1
... 
141569998, 1
141569999, 1
147280000, 0
147280001, 0
...
147289999, 0

最善の方法はsedやawkのようなものを使用しているようですが、どのように解決するのかわかりません。

答え1

awk -F, '{for (i=$1;i<=$2;i++) print i ", " $3}' file

各行に対して for ループを実行し、数字と最後のフィールドを印刷します。

答え2

Perlの場合は、次のようにします。範囲演算子リストコンテキストでは:

perl -F, -ne 'print "$_, $F[2]" for ($F[0]..$F[1])' file

または

perl -F, -ne 'print map { "$_, $F[2]" } ($F[0]..$F[1])' file

答え3

while IFS=, read -r start stop data <&3;do
  seq -f "%.0f, $data" "$start" "$stop"
done 3< file

このseqコマンドは、開始番号から停止番号までステップ1で繰り返しながらメッセージを印刷します。

  • データには書式設定特殊文字や%バックスラッシュシーケンスが含まれていません。

関連情報