2

さて、私はいくつかのテキストを持っています:

=== Blah 1 ===
::Junk I wish: 2 Ignore <br/>
::More Junk: 1.2-2.7 <br/>
::ABC: [http://www.google.com (STUFF/I/Want)]<br/>
::More2: Ignore<br/>
::More Stuf 2 Ignore: N/A<br/>

=== Blah 2 ===
::Junk I wish: More 2 Ignore <br/>
::More Junk: 1.2-2.7 <br/>
::ABC: [http://www.google.com (Other/STUFF/I/Want)]<br/>
::More2: More Ignore<br/>
::More Stuf 2 Ignore: More N/A<br/>

出力したい:

Blah 1, (STUFF/I/Want)
Blah 2, (Other/STUFF/I/Want)

必要な行の一部を取得する方法を見つけました。

gawk  '/===/ {print } /ABC/ {print $3}' file_name

これにより、次が出力されます。

=== Blah 1 ===
(STUFF/I/Want)]<br/>
=== Blah 2 ===
(Other/STUFF/I/Want)]<br/>

私が理解できないのは、不要な他の文字を取り除き、これを 1 行に入れる方法です。

4

4 に答える 4

4

改行文字を省略し、最初のブロックの 2 番目と 3 番目のフィールドのみを出力するprintf代わりに使用し、2 番目のブロックで不要なものを捨てるために使用します。printsub

awk '/===/{printf "%s %s, ",$2,$3}/ABC/{sub(/].*/,"");print $3}' file
Blah 1, (STUFF/I/Want)
Blah 2, (Other/STUFF/I/Want)

タイトルが可変長の場合:

awk '/===/{gsub(/ ?=+ ?/,"");printf "%s, ",$0}/ABC/{sub(/].*/,"");print $3}' file
Blah 1, (STUFF/I/Want)
Blah 2, (Other/STUFF/I/Want)
于 2013-03-10T18:54:26.217 に答える
3

一方通行。

の内容script.awk:

BEGIN {
    ## Characters to separate output fields
    OFS = ", "
}

## When line begins with several equal signs, remove them, both leading
## and trailing, and save the title.
$1 ~ /^=+$/ {
    gsub( /\s*=\s*/, "", $0 )
    title = $0
    next
}

## For the second field, split line with both pair of parentheses and 
## print second field.
$1 ~ /ABC/ {

    ## For GNU-Awk
    #split( $0, abc_line, /(\()|(\))/, seps )
    #printf "%s%s%s%s%s\n", title, OFS, seps[1], abc_line[2], seps[2]

    ## For Awk
    split( $0, abc_line, /(\()|(\))/ )
    printf "%s%s(%s)\n", title, OFS, abc_line[2]

}

次のように実行します。

awk -f script.awk infile

そして、次の結果が得られます。

Blah 1, (STUFF/I/Want)
Blah 2, (Other/STUFF/I/Want)
于 2013-03-10T19:00:55.573 に答える
1
gawk '/===/{header=gensub(" *=== *","","g",$0)} /ABC/{abc=gensub("]<br/>","","g",$3); print header", "abc}' file_name

これはあなたのために働くかもしれません。取り除かれた情報を変数に保存してから、それらを出力します。

于 2013-03-10T18:54:44.227 に答える
0

awk で、通常とは異なるレコード区切り記号を探す場合、解決策は非常に単純になります。

awk -v RS=' *=== *|[()]' '
  NR%4==2 {printf "%s, ", $0}
  NR%4==0 {print "(" $0 ")"}
'

ここで、レコード区切り記号は===オプションでスペース、または左または右の括弧で囲まれます。

于 2013-03-11T00:26:58.050 に答える