2015-04-28 56 views
1

對不起,但我從來沒有問過這樣的板子上的問題,請原諒經驗不足。Awk與輸入文件匹配和模式搜索

我想從輸入文件中取一個字段,比如abc.txt中的兩個字段,並在def.txt中匹配它。問題是我還需要在def.txt文件中匹配一個額外的模式。

對於exapmle,abc.txt中的字段2是「3」。我想在def.txt中搜索的模式是「efg」。我需要它返回所有符合pattern「efg」且包含「3」的行。

作爲一個額外的約束,我希望它在達到某個值後停止搜索,比如說「END」。我已經用盡了精力在awk或其他變體中找到一個簡單的單線程。

我對所有這些問題感到困惑,可以向新手尋求幫助嗎?任何幫助表示讚賞,謝謝。

下面是代碼,這是不工作: awk 'BEGIN { FS = " " } ;NR==FNR{a[$2]=++i;next} '{if ($5 in a) && ($0 ~ '/efg/')} {print $0}' abc.txt def.txt

我想實現三件事情:

  1. 匹配輸入文件中的字段來def.txt領域

  2. 在def.txt中匹配一個模式

  3. 當遇到值時停止搜索以進行考試「完」。

希望一條線解決方案,如果可能的話,我只是太多的AWK初學者。

Sample Input 
Abc.txt 
1 
2 
3 
4 

Def.txt 
1 abc 
1 efg 
1 efg some more data 
END 
2 ghi 
2 efg 
2 efg some more data 
END 
3 jkl 
3 efg 
3 efg some more data 
END 

等等...

Expected Output 
1 efg 
1 efg some more data 
2 efg 
2 efg some more data 
3 efg 
3 efg some more data 

,並與任何幫助,以使其停止在到達 「END」。而不是瀏覽整個文件並打印1 efg,2 efg等的後續實例。

+0

abc.txt中的「3」與def.txt中的「efg」匹配並在兩個文件中打印行?那兩個文件都是空格分隔的嗎?哪個文件包含「END」? – haifzhan

+0

你想用'/ efg'/'完成什麼?無論如何,發佈一些樣本輸入和期望的輸出。 –

+0

@haifzhan - 我需要的文件來自def.txt文件。我正在尋找def.txt中與abc.txt中的「3」和def.txt中的「efg」匹配的行。 「END」語句也在我需要得到結果的文件中。對於缺乏細節感到抱歉,我正在學習如何有效發佈。 – question33

回答

1

您的現有代碼存在一些明顯的問題。您提供了:

awk 'BEGIN { FS = " " } ;NR==FNR{a[$2]=++i;next} '{if ($5 in a) && ($0 ~ '/efg'/)} {print $0}' abc.txt def.txt 

我明白你要去哪裏了。我想你的意思是:

awk 'NR==FNR{a[$2];next} $0=="END"{quit} $5 in a && /efg/' abc.txt def.txt 

顯着的變化:

  • 單引號需要

    awk ' 
    
        # Step through first file, recording $2 in an array... 
        NR==FNR { 
        a[$2]; 
        next; 
        } 
    
        # Hard stop if we get a signal... 
        $0 == "END" { 
        quit; 
        } 
    
        # In the second+ file, test a condition. 
        $5 in a && /efg/ 
    
    ' abc.txt def.txt 
    

    當然,你可以通過刪除註釋和換行壓縮成一個班輪這包裝你的整個腳本。一個在開始,一個在結尾,沒有「內部」。

  • 默認情況下awk會被空白分割,所以FS可能是不必要的(除非你在你的領域有選項卡,在這種情況下你可以把FS放回去)。
  • 您不需要增加計數器。在awk中,如果僅僅提供提及一個數組元素,它就是「創建」而沒有內容,因此您可以使用像$5 in a這樣的條件而不會浪費太多內存。
  • 額外的if聲明已刪除。 Awk需要condition { statement }模式。條件是一種條件,不管它是以這種格式還是在if之內。
  • 你的條件的第二個元素縮小到只是一個正則表達式。默認情況下,awk會將其表示爲「這個正則表達式是否適用於當前輸入行」。
  • print $0命令已被刪除,因爲如果未提供語句,則這是默認行爲。
+0

這真是太棒了@ghoti,我會放棄它。 – question33

+0

我得到一個錯誤,說:'awk:致命的:無法打開源文件NR == FNR {a [$ 2];下一個; }用於閱讀的&&/efg /'中的$ 5(沒有這樣的文件或目錄)'我認爲在第二條評論之後,我認爲你的意思是讓我自己格式化命令。我只是不確定。 – question33

+0

啊,傻了。從行中刪除'-f'。我從我的答案中刪除了它。 – ghoti