我希望有一个脚本来修改一些大文本文件(100k记录),这样,对于每条记录,输出中的多行创建相当于每个输入行的第3列和第2列的差异。在输出中,我想打印记录名称(第1列),以及第2列和第3列中包含的数字之间的逐步步行。
示例平凡输入可以是(制表符分隔数据,如果它有所不同)
a 3 5
b 10 14
具有所需的输出(再次,理想地选项卡分隔)
a 3 4
a 4 5
b 10 11
b 11 12
b 12 13
b 13 14
这是一项令人遗憾的挑战,超出了我(非常)有限的能力。
任何人都可以提供问题的解决方案,还是指向正确的方向?在一个理想的世界中,我可以将它整合到一个bash脚本中,但我会采取任何有效的方法!
答案 0 :(得分:3)
Bash解决方案:
while read h f t ; do
for ((i=f; i<t; i++)) ; do
printf "%s\t%d\t%d\n" $h $i $((i+1))
done
done < input.txt
Perl解决方案:
perl -lape '$_ = join "\n", map join("\t", $F[0], $_, $_ + 1), $F[1] .. $F[2] - 1' input.txt
答案 1 :(得分:0)
使用awk
:
awk '$3!=$2 { while (($3 - $2) > 1) { print $1,$2,$2+1 ; $2++} }1' inputfile
答案 2 :(得分:0)
awk -F '\t' -v OFS='\t' '
$2 >= $3 {print; next}
{for (i=$2; i<$3; i++) print $1, i, i+1}
' filename
答案 3 :(得分:0)
完全POSIX,没有不需要的循环变量:
$ while read h f t; do
while test $f -lt $t; do
printf "%s\t%d\t%d\n" "$h" $f $((++f))
done
done < input.txt
a 3 4
a 4 5
b 10 11
b 11 12
b 12 13
b 13 14