Bashスクリプトはファイルのレコードを繰り返し、条件に基づいて値を抽出します。

Bashスクリプトはファイルのレコードを繰り返し、条件に基づいて値を抽出します。

次のクエリが役立つ場合はありがとうございます。 Bashスクリプトが必要です。私はこのスクリプト技術に初めて触れました。

どこかに次のファイルがあります。ファイル名がMemberFile.txtであるとしましょう。

#
[ID          ]  #1
[ADDRE1      ]  Address Line #1
[ADDRE2      ]  Mumbai City
[ADDRE3      ]  India
#
[ID          ]  #2
[ADDRE1      ]  House No 2
[ADDRE3      ]  Green Society
[ADDRE4      ]  Kolkatta
#
[ID          ]  #3
[ADDRE1      ]  Plot Num 77
[ADDRE2      ]  House No # [567]
[ADDRE3      ]  greener Apt
#

これらのファイルには何百万ものレコードがあります。各レコードをすばやく繰り返しインポートして保存したいです[ADDRE3 ]。また、レコードに「society」または「Num」という単語が含まれていることを確認してください(大文字と小文字を区別しない)。その場合、[ID ]そのレコードのタグ値を取得します。

予想される出力は#2と#3です。

下の1はレコードを表します。

[ID          ]  #1
[ADDRE1      ]  Address Line #1
[ADDRE2      ]  Mumbai City
[ADDRE3      ]  India

答え1

アッ解決策:

awk -v IGNORECASE=1 '/\[ID /{ r=$3; c=3; next }c-- && $0~/society/{ print r }' MemberFile.txt

出力:

#2
#3

  • IGNORECASE=1- 大文字と小文字を区別しない比較モードの設定

  • /\[ID /{ r=$3; c=3; next }-IDレコード番号の取得#<number>(3番目のフィールドへ)

  • c-- && $0~/society/- 次の3つのレコードにsociety単語が含まれていることを確認してください。

答え2

これにより、トリックを実行できます。

grep -iE '(^\[ADDRE3.*society|^\[ADDRE3.*no|^\[ADDRE3.*blabla)' -B 3 MemberFile.txt | grep "ID" | grep -o "#[0-9]*"

正確に何が起こったかを書いてください。

-iしたがって、正規表現を使用して、名前または目的の項目に達するまで「[ADDRE3」で始まる各行の後に大文字と小文字を区別しないコンテンツをフィルタリングします。-E^\[ADDRE3.*society|

ヒットすると、対応する行+-B 3その上の3行が表示されます。

次に、すべての行のIDをフィルタリングし、表示された#Numberの後にそのIDをフィルタリングします。-o

住所検索:

grep -iE '(^\[ADDRE.*society|^\[ADDRE.*no|^\[ADDRE.*blabla)' -B 3 MemberFile.txt | grep "ID" | grep -o "#[0-9]*"

答え3

perl -lne '
   next unless /^#$/ && !$flag ... /^#$/ && $flag;
   $flag++,next if /^#$/ && !$flag;
   /^\[ID\h/ and $id = s/.*\h#/#/r,next;
   push @A, $_;
   if ( (/^#$/ && $flag) ) {
      print $id if join($/, splice(@A,0,@A)) =~ /(?:^|\h)(?i:society|num)(?:\h|$)/m;
      $flag = 0; undef $id; redo;
   }
' MemberFile.txt

布材

各レコードは#(フラグがOFF)で始まり、#(フラグがON)で終わります。新しいレコードが見つかった場合、最初に取るアクションはフラグを開くことです。 (部屋に入ると火をつけるのと同じ)

レコードで ID 行が見つかると、その値が保存されます。レコードの他のすべての行の場合は、各行を配列に保存します@A

レコードの最後の行(/#/、フラグON)に達すると、改行を使用するときに配列要素に「society」または「num」という単語が含まれていることがわかっている場合は、IDを印刷します。splice配列が消去されました。

私たちはフラグをオフにして(部屋を出るときにやらなければならないように)、同じ行なので、次のレコードの先頭をニブリングするredo代わりに行います。next

ほとんど同じ方法を使用しますsedが、配列がないため、予約されたスペースを保存目的に使用します。このコードはPOSIXと互換性があり、sedGNU -ismsを使用してかなり圧縮できます。

sed -e '
   /^\[ID[[:blank:]]/,/^#$/!d
   H;/^\[ID[[:blank:]]/h;/^#$/!d
   g;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
   /[[:blank:]]num$/ba
   /[[:blank:]]society$/ba
   /[[:blank:]]num\n/ba
   /[[:blank:]]society\n/ba
   /[[:blank:]]num[[:blank:]]/ba
   /[[:blank:]]society[[:blank:]]/ba
   d;:a
   s/\n.*//
   s/^\[id[[:blank:]].*#/#/
' MemberFile.txt

結果

#2
#3

関連情報