2015-02-08 114 views
2

我需要搜索File1的名稱對File2。如果找到匹配的名字,我需要在它後面打印三行。比較兩個文件並在匹配的單詞後面打印N行

- 文件1 -

Name1 
Name2 
Name3 

- 文件2 -

Topic1 ....description... 
lineA 
lineB 
lineC 
Name1 ....description... 
lineA 
lineB 
lineC 
Name3 ....description... 
lineA 
lineB 
lineC 
Topic2 ....description... 
lineA 
lineB 
lineC 
Topic3 ....description... 
lineA 
lineB 
lineC 

- 預期結果 -

Name1 ....description... 
lineA 
lineB 
lineC 
Name3 ....description... 
lineA 
lineB 
lineC 
  • 我試圖用awk來找到兩個文件之間的匹配,只有成功地打印Name1 ....description...(不lineA - lineC

    awk 'BEGIN { while (getline < "File1") arr[$0]++ }($1 in arr)' File2 
    
  • 我知道grep命令可以用來打印使用模式

    某些行
    grep -A3 /pattern/ file 
    

我現在的問題是我不知道如何結合這兩個命令。也許有人可以建議一個Perl腳本來運行這些流程?

+0

你聽說過UNIX管道? – 2015-02-08 14:02:27

+0

err nope..i'm全新在這種環境下 – Sue 2015-02-08 14:04:02

+0

unix shell腳本怎麼樣? bash編程? – 2015-02-08 14:04:52

回答

1

你可以通過用grep包含模式的文件(-f選擇),這樣

$ grep -F -f file1 -A3 file2 
Name1 ....description... 
lineA 
lineB 
lineC 
Name3 ....description... 
lineA 
lineB 
lineC 

使用-F指示模式是固定的字符串,而不是正則表達式。

+0

謝謝glenn jackman!當我在本地Redhat上嘗試它時,該命令完美工作,但是當我在Redhat服務器上運行它時,file2中的所有內容都被打印出來:(任何想法爲什麼它是這樣的? – Sue 2015-02-08 14:52:27

+0

file1中是否有空行? – 2015-02-08 17:15:48

+0

owh yeah ..只是注意到它..again..thanks很多格倫jackman .. – Sue 2015-02-09 00:57:03

1

這應該適合你。它將File1中的所有名稱讀入散列,以便可以快速檢查來自File2的值。

File2被逐行讀取,並且第一個字段與散列進行檢查以查看它是否是所需名稱之一。如果是,則打印當前行和下面三行。

use strict; 
use warnings; 
use 5.010; 
use autodie; 

my %names; 

open my $fh, '<', 'File1'; 

while (<$fh>) { 
    chomp; 
    ++$names{$_}; 
} 

open $fh, '<', 'File2'; 

while (<$fh>) { 
    my ($name) = split; 
    if ($names{$name}) { 
    print; 
    print scalar <$fh> for 1 .. 3; 
    } 
} 

輸出

Name1 ....description... 
lineA 
lineB 
lineC 
Name3 ....description... 
lineA 
lineB 
lineC 
+0

非常感謝你鮑羅廷!!!它完美的作品! – Sue 2015-02-08 14:56:18

0

我會用xargs的:

cat File1 | xargs -I NAME grep -A3 NAME File2 

來尋找文件2的名稱和顯示匹配線和三條線後的正規途徑它是:

grep -A3 NAME File2 

生成文件1的每一行這樣的命令,使用該行,NAME是這樣的:

cat File1 | xargs -I NAME <COMMAND with NAME in it> 
相關問題