2014-08-27 26 views
1

假設FILE.TXT象下面這樣:找到了多條線路共同的元素在文本文件中

A1 B C D 
E F C H 
C J 
A2 F B 
D J C 
F T Y U I 
B C N J Y 

我需要的是來檢查開始的行模式「^ A」,然後查找後的元素(從$ 2到行尾)。然後我需要從這些元素開始尋找行中的常見元素。這裏是輸出FILE.TXT:

A1 C J 
A2 Y 

A1 J C 
A2 Y 

在輸出共同的元件(例如J和C)的順序並不重要。

P.S. Awk是首選。

+2

不清楚你的意思。另外,你到目前爲止做了什麼?到目前爲止,有[awk中的問題數量](http://stackoverflow.com/search?q=user%3A3684042+ [awk]),您應該知道如何從以下開始:) – fedorqui 2014-08-27 15:26:37

+1

對於每個'A *'行想要打印出每一行的行內容之間通用的所有元素,這些元素的起始元素等於所討論的'A *'行的元素? – 2014-08-27 15:26:52

+0

@EtanReisner:的確如此。 – user3684042 2014-08-27 15:28:53

回答

3

利用GNU AWK爲真實二維陣列和刪除陣列和長度(數組):

$ cat tst.awk 
{ for (i=1;i<=NF;i++) children[$1][$i] } 
/^A/{ parents[$1]; delete children[$1][$1] } 
END { 
    for (parent in parents) { 
     delete count 
     printf "%s", parent 
     for (child in children[parent]) 
      for (grandchild in children[child]) 
       if (++count[grandchild] == length(children[parent])) 
        printf " %s", grandchild 
     print "" 
    } 
} 

$ awk -f tst.awk file 
A1 C J 
A2 Y 

它通過只檢查該計數任何字段的出現在非數A行匹配A行中第2 +個字段的計數,因爲它表示它在每種情況下都會發生。

+0

如果我想從其他文件中獲取孫子們該怎麼辦?我的意思是,如果我們從file1中記錄父母和他們的孩子,然後在fileB中尋找孫子女,該怎麼辦?我已經嘗試通過將FNR == NR添加到第一行來修改您的代碼,並且「; next;」在第二行「孩子[$ 1] [$ 1]」之後。我還在「END」之前添加了「{for(i = 1; i <= NF; i ++)Allchildren [$ 1] [$ i]}」,並且修改了第8和9行,如「for(forch(Allchildren [child]和「if(++ count [grandchild] == length(Allchildren [parent]))」。你能讓我知道我做錯了什麼嗎? – user3684042 2014-08-28 13:52:25

+1

不要改變它的工作原樣,因爲該腳本中沒有任何內容關心您擁有多少獨立的輸入文件。只需將你喜歡的任何文件添加到arg列表awk -f tst.awk file1 file2 file3 ...中。如果這不起作用,那麼更新您的問題以顯示一些示例輸入和預期輸出並澄清您的新要求。 – 2014-08-28 15:01:02

+1

@ Ed Morton:非常感謝。我可以編輯你的程序來調整我的問題的需求。感謝您的關注。在學習awk時,你的編程風格是一個很好的示例。 – user3684042 2014-08-28 15:20:09

1

這有點難看,我覺得應該以更清晰的方式進行操作,但至少對樣本數據有效。

/^A/ { 
    amap[$1]=NF - 1 
    for (i=2; i<=NF; i++) { 
     rmap[$i]=rmap[$i] (rmap[$i]?SUBSEP:"") $1 
    } 
    next 
} 

$1 in rmap { 
    split(rmap[$1], a, SUBSEP) 
    for (f in a) { 
     for (i=1; i<=NF; i++) { 
      afmap[a[f],$i]++ 
     } 
    } 
} 

END { 
    for (af in afmap) { 
     split(af, a, SUBSEP) 
     if (afmap[af] == amap[a[1]]) { 
      o[a[1]]=o[a[1]] (o[a[1]]?" ":"") a[2] 
     } 
    } 
    for (f in o) { 
     print f, o[f] 
    } 
} 
相關問題