2013-08-30 99 views
2

我一直在尋找一種方法來解決我的問題,但已經放棄了。我對腳本相當陌生,所以請耐心等待。這是我想要做的:搜索並追加

我有一個文件(讓我們稱之爲file1)與6列。在第一列上有一個ID,並在第7有一個可替代的ID,但整列是空的:

ID col2 col3 col4 col5 col6 AltID AltID2 
a a x 43 5 54 A1  D3 
b f 4 44 9 51 B3  KL5 
c h k 90 0 52 K9  JD3 
... 

我有另一組文件(6要精確),每個具有8列(它們是製表符分隔的文件)。第四列包含與來自File1,col = ID的ID相匹配的ID,但以隨機順序排列。

我需要做的是從File1中搜索第一列的每一行中的每個ID,在其他6個文件的第四列中找到,當匹配時,將該匹配放在第7列文件1。

另一個棘手的事情是,其中一些ID完全缺失(在這種情況下,他們需要有一個「x」),而其他時候他們有一個以上的備用ID(在這種情況下,我把它們放在旁邊彼此,在File1的第7和8列)

我嘗試了一下grep,但後來偶然發現有人說awk實際上對此更好。我試圖建立一個腳本,並與本想出了:

#! /bin/bash 

while read fn; do 

STR =$(echo -ne "${fn}" ; awk ' { if($4=="${fn}") printf "%s\t", $7} ' ./*.txt) 
echo $STR > test.txt 

done < dreg.txt 

它顯然沒有工作,我知道代碼的樣子,我不知道我在做什麼(我不是),而是這是我開始的地方。我本質上是試圖讀取我創建的虛擬文件,只有第一列包含文本,然後搜索該目錄中所有其他文本文件的每一行。然後,如果發現了,我是呼應ID,然後是備用ID的名稱,希望能得到以下格式:

ID AltID的AltID2

我的計劃是打印這些結果到一個文件中,然後從那裏出發,但它不起作用。這不是最優雅的解決方案,但正如我所說,我不是很熟練。

任何幫助你們將不勝感激。如果你需要另一個例子或爲了澄清事情,請告訴我。

在此先感謝

回答

2

假設

  • 有超過2層的替代品沒有ID
  • 替代ID是在「其他」文件的第一列
  • 只有你當不存在匹配時,希望「x」出現在col7中,而不是col8,如果只有一個匹配
  • 您可以命名一個字符(DELIM)即n Ø<TAB>和意志從未出現在任何altenative ID
  • 所有文件都正好一個標題行

以下解決方案適用於我

$ cat file1 
ID  col2 col3 col4 col5 col6 
a  a  x  43  5  54 
b  f  4  44  9  51 
c  h  k  90  0  52 
$ cat file2a 
AltID col2 col3 ID 
A1  some thing a 
B1  more stuff b 
$ cat file2b 
AltID col2 col3 ID 
A2  even more a 
D1  random stuff d 
$ cat test.awk 
BEGIN { 
    FS = "\t" 
    OFS = FS 
    DELIM = ";" 
    MISSING = "x" 
} 
FILENAME != "file1" { 
    if (FNR != 1) { 
     alt[$4] = (alt[$4] ? alt[$4] "" DELIM : "") "" $1 
    } 
    next 
} 
FNR == 1 { 
    $7 = "AltID" 
    $8 = "AltID2" 
    print 
    next 
} 
{ 
    idcount = split(alt[$1], ids, DELIM) 
    $7 = (idcount ? ids[1] : MISSING) 
} 
idcount > 1 { 
    $8 = ids[2] 
} 
1 
$ awk -f test.awk file2* file1 
ID  col2 col3 col4 col5 col6 AltID AltID2 
a  a  x  43  5  54  A1  A2 
b  f  4  44  9  51  B1 
c  h  k  90  0  52  x 

隨意在評論索要adjustements或解釋,我會相應地更新我的答案。

+0

嗨sg lecram 非常感謝該腳本。它幾乎完美地工作。我現在遇到了一個問題,它偶爾會在第二列放置「x」,並在第一列放置ID。我還注意到,在某些時候它會打印兩次ID,所以我最終會在某些時候出現三列。 – user2647734

+0

其實,忽略這一點。我解決了這個問題。我有excel插入到txt文件中的換行符。擺脫他們,它像一個魅力工作。非常感謝! – user2647734