2013-02-24 24 views
1

我花了一些時間考慮如何解決這個問題,但我不確定,而且我對unix的使用目前相當有限。Unix - 查找文件中的模式,複製到另一個文件

我有一個文本文件,可以給它一個名稱爲「Text.txt」,其中包含大量的信息。比方說,它包含:

SomethingA: aValue 
SomethingB: bValue 
SomethingC: cValue 
SomethingD: dValue 
SomethingD: anotherDValueThisTime 
SomethingA: aValueToIgnore 

我想通過「TEXT.TXT」進行搜索,並找到了一些值,然後把這些值在一個新的文件,output.txt的。

這會變得更棘手一點,因爲我想要做的是獲取somethingA的第一個值,然後獲取發生的每個SomethingD值。

所以在「output.txt的」輸出應該是:

aValue 
dValue 
anotherDValue 

第二個「SomethingA」值要被忽略,因爲這已經不是第一次「SomethingA」值。

我想象的邏輯是這樣的: 查找SomethingA> output.txt的 找到所有SomethingD的>> output.txt的

但我就是不能完全得到它。 任何幫助非常感謝!

+1

如果somethingD在輸入文件中的somethingA之前,您是否在意? – Stobor 2013-02-24 13:49:16

+0

排序不是問題。只要所有的SomethingD都在一起,不管是在開始還是結束時都有A事件發生,這並不重要。 – ThePerson 2013-02-24 13:52:51

+0

在* input *文件中? – Stobor 2013-02-24 13:58:38

回答

2

awk是理想

awk '/^SomethingA/ && ! a++ || /^SomethingD/ { print $2 }' FS=: text.txt > output.txt 

這是一個有點草率,但你可以更精確的搭配:

awk '$1 == "SomethingA" && ! a++ || $1 == "SomethingD" { print $2 }' FS=: text.txt > output.txt 

不幸的是,這需要的鑰匙固定字符串。如果你想有一個正則表達式,你可以這樣做:

awk 'match($1, "pattern") && ... 
+0

你爲我省了很多頭撞。感謝您的解決方案,我會花一些時間閱讀awk。這個解決方案實際上是第一次完美運行。謝謝。我剛看到你的第二個答案/改進。我只需要一個固定的字符串,因爲它們都是相同的。再次感謝,我真的很感激。 – ThePerson 2013-02-24 13:57:57

+0

如果你想在awk中匹配一個正則表達式的字段,你可以使用'$ 1〜/ pattern/{stuff}'或者$ 1!〜/ pattern/{stuff}'。 – Stobor 2013-02-24 14:50:14

+0

@Stobor謝謝,這絕對是比較合適的。我懇求暫時失憶症。 – 2013-02-24 15:00:11

1
grep -m 1 somethingA inputfile.txt >outputfile.txt 
grep somethingD inputfile.txt >>outputfile.txt 

grep選項-m設置你想獲得比賽的最大數量。

>>附加到文件而不是覆蓋它像>那樣。

相關問題