2013-07-12 56 views
0

我有類似的問題,如last time兩個文件匹配後的行

這一次我有一個header文件看起來像:

>random header 2 
>random header name1 

和我basefile

>random header name1 
wonderfulstringwhatsoevergoeson 
>random header 2 
someotherline 

現在的目標是,要具備以下的輸出:

someotherline

奇妙的串什麼也不要

所以我想從basefile匹配後的行。 (只有這一個,而不是標題)

重要的是,它應該保持header的順序。

排序不起作用,因爲它會保持字母順序,這不應該發生。

我無法弄清楚,怎麼可能grep的比較兩個文件,只是給比賽結束後的行:/

+0

你可以修改'sort'。只要使用'sort _sort_function ...'[看看這裏](http://perldoc.perl.org/functions/sort.html) – 2013-07-12 11:48:00

回答

1

讀取basefile%h散列,後來遵循header文件中指定鍵順序,

perl -ne 'BEGIN{ open $F,pop or die $!; %h=<$F> } print $h{$_}' header basefile 
+0

啊,是的,perl語法的精彩的清晰度:-)。 –

+0

@EdMorton其實這個看起來相當不錯:) –

1

試試這個慶典一行代碼:

while read line; do match=$(sed -n "/$line/{ n;p}" basefile); echo $match; done < 'header' 

這將工作,當您basefile始終有相應標題的一行定義。

頭:

sat:~# cat header 
>random header 2 
>random header name1 

basefile:

sat:~# cat basefile 
>random header name1 
wonderfulstringwhatsoevergoeson 
>random header 2 
someotherline 

輸出:

sat:~# while read line; do match=$(sed -n "/$line/{ n;p}" basefile);echo $match; done < 'header' 
someotherline 
wonderfulstringwhatsoevergoeson 
3

這將做的工作適合你:

awk 'FNR==NR 
    { 
     a[$0]=FNR;i=FNR;next 
    } 
    ($0 in a) 
    { 
     t=$0; 
     getline;b[a[t]]=$0 
    } 
    END 
    { 
     for(k=1;k<=i;k++)print b[k] 
    }' head base 
+0

這不會保留'header'的順序! –

+0

現在它也適用於訂單。 – Vijay

+0

'BEGIN {i = 0}'是多餘的。 –

2

這應做到:

awk ' 
    { recs[NR] = $0 } # store the header lines in 1->(NR-FNR) and the basefile lines in ((NR-FNR)+1)->NR 
    END { 
     for (hdrNr=1; hdrNr<=(NR-FNR); hdrNr++) { 
      hdr = recs[hdrNr] 
      for (lineNr=(NR-FNR)+1; lineNr<=NR; lineNr++) { 
       line = recs[lineNr] 
       if (line == hdr) { 
        print recs[lineNr+1] 
       } 
      } 
     } 
    } 
' header basefile 

上的只是存儲在由索引的數組匹配的行@Vijays想法跟進讀取標題的順序,以下是如何在不使用getline的情況下執行此操作,沒有不必要的變量,使用有意義的變量名稱,並且不用爲每個不匹配標題打印空行:

awk ' 
    NR==FNR { hdr2nr[$0] = FNR; next } 
    hdrNr { hdrNr2line[hdrNr] = $0 } 
    { hdrNr = hdr2nr[$0] } 
    END { 
     for(hdrNr=1; hdrNr<=(NR-FNR); hdrNr++) 
      if (hdrNr in hdrNr2line) 
       print hdrNr2line[hdrNr] 
    } 
' header basefile 

這假定給定的標題只能在basefile中出現一次。

1

這可能爲你工作(GNU SED):

sed -r 'N;s/^(.*)\n(.*)/s|^\1$|\2|/' base_file | sed -f - header_file 

打開base_filesed腳本並運行它反對header_file

相關問題