2012-01-09 119 views
1

我有這種文件file-1的:記錄過濾

1  1  1.1552422143268792 
1  2  1.1552422143268792 
1  3  1.1552422143268792 
1  4  1.1552422143268792 
2  1  2.1906014042706916 
2  2  2.1906014042706916 
2  3  2.1906014042706916 
2  4  2.1906014042706916 
2  1  4.1906014042706916 
2  2  4.1906014042706916 
2  3  4.1906014042706916 
2  4  4.1906014042706916 
3  1  3.1876823799523781 
3  2  3.1876823799523781 
3  3  3.1876823799523781 
3  4  3.1876823799523781 
4  1  0.6213184222668061 
4  2  0.6213184222668061 
4  3  0.6213184222668061 
4  4  0.6213184222668061 

,我有antoher文件太file-2

1 
2 
4 

我想從file-1過濾那些記錄,其中的值第一列與file-2相同,所以我想得到這個輸出

1  1  1.1552422143268792 
1  2  1.1552422143268792 
1  3  1.1552422143268792 
1  4  1.1552422143268792 
2  1  2.1906014042706916 
2  2  2.1906014042706916 
2  3  2.1906014042706916 
2  4  2.1906014042706916 
2  1  4.1906014042706916 
2  2  4.1906014042706916 
2  3  4.1906014042706916 
2  4  4.1906014042706916 
4  1  0.6213184222668061 
4  2  0.6213184222668061 
4  3  0.6213184222668061 
4  4  0.6213184222668061 

任何人都可以幫忙嗎?

回答

4
awk 'NR==FNR{f2[$1];next}$1 in f2' file-2 file-1 
+0

看起來是一個班輪超過3派好得多。希望你跟我更新它。 :) – 2012-01-10 05:15:42

+0

嗨@JaypalSingh,是的,沒問題!我更喜歡前面的代碼縮進,但是我也沒有那個問題:) – 2012-01-10 09:00:41

1

您可以使用grep中的-f選項從文件中讀取模式。但首先你必須改變模式,以便它們只與第一個字段匹配。您可以通過使用sed^添加到文件-2中的每個模式的開始處和結尾以及在命令中使用進程替換來執行此操作。

完整的命令是:

grep -f <(sed -e "s/^/^/g" -e "s/$/ /g" file-2) file-1 
4

很簡單使用join

join file-1 file-2 

必須將文件分類爲join工作。該排序基於文本,而不是數值,因此您可能需要先將其排序爲臨時文件。喜歡的東西:

sort file-2 > sorted.tmp 
sort file-1 | join - sorted.tmp 
+1

如果你的shell是'bash':'join <(sort -n file),你可以使用命令subtitution而不是排序到temp文件-1)<(sort -n file-2)' - 它實際上做的是同樣的事情,但有點乾淨。 – Sorpigal 2012-01-09 14:15:32

+1

@Sorpigal不是'sort -n'; 'join'匹配任意字符串,而不是數字,所以需要一個詞典排序。一般來說,數字排序不可靠。 – 2012-01-09 14:20:14

+0

根據他的樣本數據,我不認爲我們在這種情況下通常需要擔心。 – Sorpigal 2012-01-09 15:40:06

1

這可能會爲你工作:

sed 's/.*/\/^& \/p/' file-2 | sed -nf - file-1 
1

這裏是另一種方式在awk做到:

awk 'NR==FNR{a[$1];next} !($1 in a){next}1' file-2 file-1