打印可变数字行输出

时间:2013-05-28 17:33:52

标签: bash

我希望有一个脚本来修改一些大文本文件(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脚本中,但我会采取任何有效的方法!

4 个答案:

答案 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