0

前回と同様の問題があります。

今回は次のheaderようなファイルがあります。

>random header 2
>random header name1

と私basefile

>random header name1
wonderfulstringwhatsoevergoeson
>random header 2
someotherline

今の目的は、次の出力を得ることです。

別の回線

素晴らしい文字列なんやかんや

だから私はからの試合後の行が欲しいbasefile. (ヘッダーではなく、これのみ)

これで重要なのは、 の順序を維持することですheader

並べ替えは機能しません。アルファベット順が維持されるためです。これは発生しないはずです。

grepが2つのファイルを比較して、一致した後に行を表示する方法がわかりませんでした:/

4

5 に答える 5

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

これは、特定のヘッダーがベースファイルに 1 回しか表示されないことを前提としています。

于 2013-07-12T13:02:26.683 に答える
1

ハッシュに読み込み、後でファイルで指定されたキーの順序にbasefile従います。%hheader

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

これはうまくいくかもしれません(GNU sed):

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

をスクリプトにbase_file変換し、に対して実行します。sedheader_file

于 2013-07-14T05:34:14.490 に答える