私のファイルにはスコープで書かれた値が含まれており、それを一般的なリストに「マッピング解除」する必要があります。これを効率的に行うにはどうすればよいですか?
例:
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で繰り返しながらメッセージを印刷します。
- データには書式設定特殊文字や
%
バックスラッシュシーケンスが含まれていません。