2012-05-23 13 views
1

我是Unix新手,並且遇到連接兩個製表符分隔的文本文件時遇到問題的情況,該文本文件基於帶有連字符索引的字段。例如:在Unix中加入連字符索引字段

file1.txt 
33-47 10  22  -99  10 
33-48 15  22  165  456 
33-101 10  22  -99  15.8 
33-126 10  22  -99  15.5 
34-133 10  22  -99  13 
40-109 10  22  -99  12 
41-102 88  21  -99  20 
45-169 54  214  -99  4 
100-11 652  524  87  5 
101-25 45  54  153  8 
101-26 1285 12  155  9.5 

​​

從本質上講,文件1是一個查找表,我想附加文件1的匹配線到文件2,以創建一個完整的表的變量,即:

file3.txt (expected) 
1  5432 545  33-101 10  22  -99  15.8 
1  5524 5420 33-126 10  22  -99  15.5 
0  855520 52220 33-47 10  22  -99  10 
0  5463 5420 34-133 10  22  -99  13 
0  5563 5423 40-109 10  22  -99  12 
1  6098 -99  40-109 10  22  -99  12 

我使用Cygwin,並試圖第一排序的字段數值,通常,並且與LC_COLLATE = C語言環境,以及許多AWK NR == FNR命令,但我仍然得到一個空白k outfile。

這是全新的,非常令人沮喪。如果可以的話請幫忙!

謝謝!

回答

1

這對我的作品,但我不是在Cygwin:

awk 'NR==FNR{info[$1]=gensub(/[^\t]*\t/,"",1)} NR!=FNR{printf"%s\t%s\n",$0,info[$NF]}' file1.txt file2.txt 

我敢肯定有人可以提高對...

+0

這真棒,適合我。我還發現加入工作,但我的一些文件有空白把它扔掉。 如果你得到第二個翻譯我會永遠感激! – akw

+0

一些解釋: – SignalToNoise

+0

一些解釋: 讀取文件1(NR == FNR) 構建數組信息。索引是第1列中的值(awk使用字符串作爲索引) 數組信息[xx-yy]的值是字符串=行的其餘部分 gensub佔用行($ 0)並替換第一個以tab/[^ \ t] * \ t /由一個空字符串組成。這刪除了第一個列。 第三代gensub意味着只替換第一個匹配。 /[^ \ t] * \ t /:正則表達式匹配許多非選項卡字符後跟一個選項卡。 讀取文件2(NR!= FNR) $ NF:每行的最後一個字。發生匹配數組信息的索引。 打印行($ 0),追加info [$ NF]的值 – SignalToNoise

1

我會非常興趣知道你如何得到join的工作。

這裏是一個非常難看方式:

a='{split($f, a, /-/); $f = sprintf("%05d%05d", a[1], a[2]); print}' 
join -1 4 -2 1 -o 1.1 1.2 1.3 0 2.2 2.3 2.4 2.5 2.6 2.7 2.8 \ 
    <(awk -v f=4 "$a" file2.txt | sort -k4,4) | 
    <(awk -v f=1 "$a" file1.txt | sort) \ 
    awk 'BEGIN {OFS = "\t"} {$4 = substr($4, 1, 5) + 0 "-" substr($4, 6, 5) + 0; print}' 

輸出:

0  855520 52220 33-47 10  22  -99  10 
1  5432 545  33-101 10  22  -99  15.8 
1  5524 5420 33-126 10  22  -99  15.5 
0  5463 5420 34-133 10  22  -99  13 
0  5563 5423 40-109 10  22  -99  12 
1  6098 -99  40-109 10  22  -99  12 

如果省略-o輸出指定(以及在最終awk$4的字段更改爲$1),從而縮短命令,這就是輸出的樣子(常見字段優先):

33-47 0  855520 52220 10  22  -99  10 
33-101 1  5432 545  10  22  -99  15.8 
33-126 1  5524 5420 10  22  -99  15.5 
34-133 0  5463 5420 10  22  -99  13 
40-109 0  5563 5423 10  22  -99  12 
40-109 1  6098 -99  10  22  -99  12 

上面的工作是在關鍵字段中填充數字並刪除連字符,然後再撤消。這允許一個簡單的詞法分類。

我試圖使用sort -V(版本排序),而不是使用填充技術。它給出正確的排序順序,但join不同意。