2013-06-28 70 views
2

我有兩個文件。從兩個文本文件中獲取公共行

第一(file1)是像這樣: (總有一個「text'line之前headerline)

>random header name1 
wonderfulstringwhatsoevergoeson 
>random header 2 
someotherline 
... 

另一個文件(file2)是file1像修飾的文件: (頭部已被去除和線被混洗,一個新的報頭已被添加)的file1

>name 
someotherline 
wonderfulstringwhatsoevergoeson 

每一行(不報頭)發生在file2file2中的行順序不同於file1。 這兩個文件應保持它們的順序。

file2

輸出的每一行都應該是一樣: (的file2頭可以忽略不計)

>random header 2 
>random header name1 

有沒有人線索,該怎麼辦呢?

問候

+2

我向你保證,他們可以進行排序。 – ctn

+0

你是什麼意思:他們不能排序?他們太大了嗎?或者它是流,而不是文件本身?這很重要,因爲不可分類的原因可能會限制您的選擇。一般來說,據我所知 - 你想找到在這兩個文件中都是唯一的行。這通常可以通過:'cat files * |完成排序| uniq -u' – 2013-06-28 09:37:31

+0

@depesz:爲避免無用的管道蛇使用'sort files * | uniq -u'。 – TrueY

回答

2

代碼GNU

 
$sed '/^[>]/N;s#\(.*\)\n\(.*\)#/\2/s/.*/\1/p#' file1|sed -nf - file2 
>random header 2 
>random header name1 
+0

非常感謝您!你解決了我的問題:) – user2525078

3

鑑於澄清這些文件應該保持不變,只需使用:

sort file1 file2 file2 | uniq -u 

就大功告成了。

或者,如果文件很大,使(文件1 +文件2 +文件2)排序是太多的負擔,您可以使用此:

comm -23 <(sort file1) <(sort file2) 

哪樣只是有點每個文件(磁盤上的文件將保持原樣,不會被修改),然後打印存在於file1中但不存在於file2中的行。

實施例:

=$ cat file1 
some header 
abc 
cdf 
efg 
other header 

=$ cat file2 
file2 header 
cdf 
file2 header part2 
efg 
abc 

=$ comm -23 <(sort file1) <(sort file2) 
other header 
some header 
2

如果我理解正確,要打印從文件1相對應的文件2中的每個元件的各標頭。

#!/bin/bash 

cat file2 | 
while read line; do 
    grep -B 1 "$line" file1 | head -n1 
done 

grep -B 1將在比賽前打印一行。我們可以頭部切斷第一行。
這可能被稱爲黑客。 (但我仍然是一個初學者)。

file1的:

>隨機頭NAME1
wonderfulstringwhatsoevergoeson
>隨機頭2
someotherline

file2的:

someotherline
wonderfulstringwhatsoevergoeson

輸出:

>隨機頭2
>隨機頭NAME1

此外理解這種解決方案通過depesz指出的是緩慢的。

+0

這種方法會比較慢,因爲它必須將file2重複N次,其中N是file2中的行數。另外,我不確定這是否是OP想要的,但我留給他去判斷,因爲我不確定我是否理解他的描述。 – 2013-06-28 11:51:34

+0

@mohit非常感謝你!這與我搜索的內容非常接近!如果標題是前面的一行而不在同一行中,我該怎麼辦? – user2525078

+0

@ user2525078更正。 – mohit