【问题标题】:merge / append files and re-number first column in unix合并/追加文件并重新编号unix中的第一列
【发布时间】:2012-05-27 21:45:23
【问题描述】:

我在不同目录(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(间距为 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`

【问题讨论】:

  • 编号方案不清楚。为什么数字 80 或数字 100 不存在?
  • 谢谢,这是我的错......数据集之间的数字相加,但间隔可能不同-已更正错误

标签: file unix sed awk


【解决方案1】:

你可以使用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

这是你的意思吗?

【讨论】:

  • 感谢您的回复...我得到第二个文件的不同值,因为这是不同的间隔 20 而不是 10...否则完美
  • 再次说明您想要的编号方案。上面的代码只是增加了 10。
  • 再次抱歉,虽然我有上述较小的数据集正确但组合错误。我更正了
【解决方案2】:
#!/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

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

【讨论】:

  • 非常好的作品,是否可以消除合并文件中文件之间的空白,我只是为了清楚起见
  • 只是一件小事,我尝试应用所有目录(可能我将使用 ./renumber.txt {*}/run.txt 拥有 x 个目录,但不工作....你对此有什么建议..
  • @hijo:去掉星号周围的花括号。您仅将它们用于构造列表(例如)。所以应该是./renumber.txt */run.txt
【解决方案3】:
awk '{$1="";print NR"0",$0}' A/run.txt B/run.txt C/run.txt > combined.txt

【讨论】:

    【解决方案4】:

    这可能对你有用:

    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
    

    【讨论】:

      猜你喜欢
      • 2017-08-21
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 2014-08-29
      • 2016-11-17
      • 2019-12-29
      • 1970-01-01
      • 2022-01-24
      相关资源
      最近更新 更多