1

我想要一个脚本来修改一些大型文本文件(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

4 回答 4

3

重击解决方案:

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
于 2013-05-28T17:43:42.150 回答
0
awk -F '\t' -v OFS='\t' '
    $2 >= $3 {print; next}
    {for (i=$2; i<$3; i++) print $1, i, i+1}
' filename
于 2013-05-28T18:52:23.307 回答
0

awk

awk '$3!=$2 { while (($3 - $2) > 1) { print $1,$2,$2+1 ; $2++} }1' inputfile
于 2013-05-28T17:55:18.553 回答
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
于 2013-05-28T19:40:50.697 回答