2

我在不同的目录(3 个不同的名称)中有很多(3 个只是一个例子)文本文件,如下所示:

目录:A、文件名:run.txt 格式:txt 制表符分隔

; file one 
10     0.2   0.5   0.3
20     0.1   0.6   0.8
30     0.2   0.1   0.1
40     0.1   0.5   0.3

目录:B,文件名:run.txt 格式:txt 制表符分隔

; file two 
10     0.2   0.1   0.2
30     0.1   0.6   0.8
50     0.2   0.1   0.1
70     0.3   0.4   0.4

目录:C,文件名:run.txt 格式:txt 制表符分隔

; file three 
10     0.3   0.3   0.3
20     0.3   0.6   0.8
30     0.1   0.1   0.1
40     0.2   0.2   0.3

我想将所有三个 run.txt 文件合并为一个并重新编号第一列。生成的新文件将如下所示:

; file combined 
10     0.2   0.5   0.3
20     0.1   0.6   0.8
30     0.2   0.1   0.1
40     0.1   0.5   0.3

50     0.2   0.1   0.2
70     0.1   0.6   0.8
90     0.2   0.1   0.1
110    0.3   0.4   0.4

120    0.3   0.3   0.3
130    0.3   0.6   0.8
140    0.1   0.1   0.1
150    0.2   0.2   0.3

这就是我的代码所在:

cat A/run.txt B/run.txt C/run.txt > combined.txt

(1) 我不知道如何按第一列重新编号

(2) 我也不怎么处理以“;”开头的评论

编辑:

让我明确一下编号方案:A/run.txt、B/run.txt 和 C/run.txt 实际上是并行运行合并为一个。因此每个都将存储带有运行编号的样本。但是,运行之间的差距可能是不均匀的。

(1) 对于第一个文件 A/run.txt (gap is 10, 20-10, 30-20)

10, 10+10, 20+10, 30+10

(2) 对于第二个文件 B/run.txt,从 10 开始,但间隔为 20(例如 30-10、50-70、70-50)

40 (from last line of the first file) + 10 (first in file two) = 50, 
 50 + 20 = 70,70 + 20 = 90,  90+ 20 = 110

(3) 文件 C/run.txt 从 10 开始,增量为 10

110 (last number in file 2) + 10 = 120, 120+ 10 = 130,
 130+10 = 140, 140+10 = 150`
4

4 回答 4

2

你可以使用awk

  awk 'BEGIN{l=0;print "; file combined"}; {if($1!=";")print l,$2,$3,$4;l=l+10}'  A/run.txt B/run.txt C/run.txt > combined.txt

编辑

我猜测了您的编号方案(您仍然没有提供规范)并提出:

  awk 'BEGIN{line=0;last=0;print "; file combined"}; !/^;/{if($1<last){line=last+$1}else{line=line+$1-last;last=$1};print line,$2,$3,$4}' \
  A/run.txt B/run.txt C/run.txt > combined.txt

是你的意思吗?

于 2012-05-21T12:09:24.220 回答
1
#!/usr/bin/awk -f
BEGIN {
    OFS = "\t"
    printf "%s\n", "; file combined"
}
! /^;/ {
    if (FILENAME != prevfile) {
        prevnum = $1
        prevfile = FILENAME
        interval = 10
        c = 0
    }
    c++
    if (c == 2) {
        interval = $1 - prevnum
    }
    $1 = (i += interval)
    print
}

要运行它:

$ ./renumber {A,B,C}/run.txt

给定您的样本输入,它会产生与您的样本完全匹配的输出。

于 2012-05-21T14:16:40.320 回答
0
awk '{$1="";print NR"0",$0}' A/run.txt B/run.txt C/run.txt > combined.txt
于 2012-05-21T12:40:35.583 回答
0

这可能对您有用:

awk -F'[\t]' 'lastfile!=FILENAME{lastfile=FILENAME;i=l};{$1+=i;l=$1};1' A/run.txt B/run.txt C/run.txt > combined.txt
于 2012-05-21T13:32:32.003 回答