0

AWK で次の行をフィルタリングする方法を考えていました。

DSL - 

  1. Digital Simulation Language.  Extensions to FORTRAN to simulate analog
computer functions.  "DSL/90 - A Digital Simulation Program for Continuous
System Modelling", Proc SJCC 28, AFIPS (Spring 1966).  Version: DSL/90 for
the IBM 7090.  Sammet 1969, p.632.

FLIP - 

  1. Early assembly language on G-15.  Listed in CACM 2(5):16 (May 1959).

  2. "FLIP User's Manual", G. Kahn, TR 5, INRIA 1981.

  3. Formal LIst Processor.  Early language for pattern-matching on LISP
structures.  Similar to CONVERT.  "FLIP, A Format List Processor", W.
Teitelman, Memo MAC-M-263, MIT 1966.

だから私はこのようなものを得ることができます:

DSL

FLIP

AWK で次の文を使用しています。

BEGIN { RS = "\n\n\n" ;  FS = " - " } 

{ print $1 }

しかし、私が得るのはこれだけです:

DSL

前もって感謝します!

4

5 に答える 5

1

@JonathanLeffler は、特定の質問に対して適切な awk 回答を提供してくれましたが、その形式のファイルで多くの作業を行う場合は、レコードを改行で区切って各リスト項目を 1 行にするように再フォーマットすることを検討することをお勧めします。 、例:

$ cat file
DSL -

  1. Digital Simulation Language.  Extensions to FORTRAN to simulate analog
computer functions.  "DSL/90 - A Digital Simulation Program for Continuous
System Modelling", Proc SJCC 28, AFIPS (Spring 1966).  Version: DSL/90 for
the IBM 7090.  Sammet 1969, p.632.

FLIP -

  1. Early assembly language on G-15.  Listed in CACM 2(5):16 (May 1959).

  2. "FLIP User's Manual", G. Kahn, TR 5, INRIA 1981.

  3. Formal LIst Processor.  Early language for pattern-matching on LISP
structures.  Similar to CONVERT.  "FLIP, A Format List Processor", W.
Teitelman, Memo MAC-M-263, MIT 1966.

$ awk '!/^[[:space:]]*$/{printf "%s%s", (NF==2 && /-[[:space:]]*$/ ? rs rs : (/^ +[[:digit:]]+\./ ? rs : "")), $0; rs="\n"} END{print ""}' file
DSL -
  1. Digital Simulation Language.  Extensions to FORTRAN to simulate analogcomputer functions.  "DSL/90 - A Digital Simulation Program for ContinuousSystem Modelling", Proc SJCC 28, AFIPS (Spring 1966).  Version: DSL/90 forthe IBM 7090.  Sammet 1969, p.632.

FLIP -
  1. Early assembly language on G-15.  Listed in CACM 2(5):16 (May 1959).
  2. "FLIP User's Manual", G. Kahn, TR 5, INRIA 1981.
  3. Formal LIst Processor.  Early language for pattern-matching on LISPstructures.  Similar to CONVERT.  "FLIP, A Format List Processor", W.Teitelman, Memo MAC-M-263, MIT 1966.

そうすれば、出力を簡単に処理して印刷したり、必要なことをしたりできます。

1) すべてのヘッダー行と最初の箇条書き項目を印刷するには:

$ awk '...' file | awk 'BEGIN{RS=""; ORS="\n\n"; FS=OFS="\n"} {print $1,$2}'
DSL -
  1. Digital Simulation Language.  Extensions to FORTRAN to simulate analogcomputer functions.  "DSL/90 - A Digital Simulation Program for ContinuousSystem Modelling", Proc SJCC 28, AFIPS (Spring 1966).  Version: DSL/90 forthe IBM 7090.  Sammet 1969, p.632.

FLIP -
  1. Early assembly language on G-15.  Listed in CACM 2(5):16 (May 1959).

2) ヘッダー行と "FLIP" レコードの 2 番目の箇条書き項目を印刷するには:

$ awk '...' file | awk 'BEGIN{RS=""; ORS="\n\n"; FS=OFS="\n"} /^FLIP -/{print $1,$3}'
FLIP -
  2. "FLIP User's Manual", G. Kahn, TR 5, INRIA 1981.

3) ヘッダー行とそのヘッダーの箇条書き項目の数を印刷するには:

$ awk '...' file | awk 'BEGIN{RS=""; FS=OFS="\n"} {print $1 NF-1}'
DSL - 1
FLIP - 3

などなど

于 2013-08-12T11:47:09.660 に答える
1

形式が一定であると仮定します (最初のエントリにスペースはありません):

if ($2=="-"){print $1}

編集:しかし、次のようなエントリがある場合:

Objective C -
...

次のようなものが必要です。

if ($NF=="-"){$NF="";print}

awk は、予測可能な形式のフラット ファイルの解析に非常に優れています。

于 2013-08-12T09:18:23.083 に答える
1

2 つの単語しかない行を探しているようですが、2 番目の単語は-です。もしそうなら、あなたは書くことができます:

awk 'NF == 2 && $2 == "-" { print $1 }'

$1行の先頭から始まることを主張するようにさらに修飾することができます(先頭の空白はありません):

awk '$0 !~ /^ / && NF == 2 && $2 == "-" { print $1 }'

これらは両方とも、指定されたデータだけを含む行を生成DSLFLIPます。

于 2013-08-12T10:08:04.573 に答える
0

スキップしたいすべての行がスペースで始まる場合、これは機能します:

awk -F"-" '{if (substr($1,1,1)!=" ")print $1}'
于 2013-08-11T22:12:35.820 に答える
0

短いgrep行でそれを行うことができます:

grep -Po '.*(?= -\s*$)' file
于 2013-08-12T08:48:25.287 に答える