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

3 つの run.txt ファイルをすべて 1 つに結合し、最初の列の番号を付け直したいと考えています。結果の新しいファイルは次のようになります。

; 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) 1列目によるリナンバリングの処理方法がわからない

(2)「;」で始まるコメントの扱いもわかりません。

編集:

番号スキームについて明確にしましょう。A/run.txt、B/run.txt、および C/run.txt は、実際には並列実行されて 1 つに結合されます。そのため、それぞれに実行番号付きのサンプルが保存されます。ただし、ギャップは実行間で不均一になる可能性があります。

(1) 最初のファイル A/run.txt の場合 (ギャップは 10、20-10、30-20)

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

(2) 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 -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 に答える
0
awk '{$1="";print NR"0",$0}' A/run.txt B/run.txt C/run.txt > combined.txt
于 2012-05-21T12:40:35.583 に答える