0

我有和上次类似的问题。

这次我有一个header文件看起来像:

>random header 2
>random header name1

和我的basefile

>random header name1
wonderfulstringwhatsoevergoeson
>random header 2
someotherline

现在的目标是获得以下输出:

其他线路

美妙的弦

所以我想要比赛结束后的线路basefile。(只有这个,不是标题)

重要的是,它应保持header.

排序不起作用,因为它会保持字母顺序,这不应该发生。

我不知道 grep 如何比较两个文件并在匹配后给出行:/

4

5 回答 5

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
于 2013-07-12T12:40:13.140 回答
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

假设给定的标头只能在基本文件中出现一次。

于 2013-07-12T13:02:26.683 回答
1

这可能对您有用(GNU sed):

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

base_file转换为sed脚本并针对header_file.

于 2013-07-14T05:34:14.490 回答
1

试试这个 bash 单线:

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

当您的基本文件始终具有相应标题的一行定义时,这将起作用。

标题:

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

基本文件:

 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
于 2013-07-12T12:01:18.590 回答
1

读入哈希,然后按照文件中basefile指定的键顺序,%hheader

perl -ne 'BEGIN{ open $F,pop or die $!; %h=<$F> } print $h{$_}' header basefile
于 2013-07-12T12:34:26.860 回答