"grep"出力の空のフィールドを文字列に置き換えます。

"grep"出力の空のフィールドを文字列に置き換えます。

私は長いドキュメント(この長いファイルにはそれぞれ日付/時刻で始まるいくつかの段落が含まれています)を「grep」(1行ずつ読み取る)にwhileループを使用しています。

目的は、特定のフレーズを検索し、その横にあるその段落の日付/時刻を印刷またはエコーすることです。 grepがフレーズをキャプチャできないときに「NULL」文字をどのように「エコー」または「印刷」するのですか?たとえば、

ファイル(test.txt)に次の3つの段落があるとします。

 20170101,05:00 AM, I am using grep to read certain phrase1 in a long document. 
 20170102,09:30 AM, I am using grep to read certain phrase2 in a long document. 
 20170103,05:30 AM, I am using grep to read page in a long document. 

「一部の構文」と日付/時刻をエコーまたは印刷し、「一部の構文が利用できない場合」出力をNULLに置き換える方法なので、出力は次のようになります。

 20170101,05:00 AM,certain phrase1
 20170102,09:30 AM,certain phrase2
 20170103,05:30 AM,NULL
.
.
.

私は以下を使用します:

while read -r line; do
date=$(grep -c "201*")
phrase=$(grep  -Eo "certain phrase")

echo $date,$phrase
done < test.txt

答え1

while read -r line; do
  date=$(grep -Eo  "201.{12}.M," <<< "$line")
  phrase=$(grep  -Eo "certain phrase" <<< "$line")
  echo "${date}${phrase:-NULL}"
done < test.txt

あなたはこの文を読んでいますが、それについて不思議ではありません。日付部分を計算する代わりに、最初のgrepの正規表現を調整しました-c。パズルの最後の部分は$ phrase変数を使用することです。パラメータ拡張NULL 値を「NULL」という単語に置き換えます。

答え2

次のようなことを提案します。

awk 'BEGIN {OFS=FS=","} 
  /201/ {
    if (match($0,"certain phrase")) {
      print $1, $2, substr($0,RSTART,RLENGTH+1)
    } else {
      print $1, $2, "NULL"
    }
  }' file

入力データでテストします。

$ awk 'BEGIN {OFS=FS=","} 
>   /201/ {
>     if (match($0,"certain phrase")) {
>       print $1, $2, substr($0,RSTART,RLENGTH+1)
>     } else {
>       print $1, $2, "NULL"
>     }
>   }' file
 20170101,05:00 AM,certain phrase1
 20170102,09:30 AM,certain phrase2
 20170103,05:30 AM,NULL

答え3

greppingを実行する代わりに、while1つのスクリプトsedですべての操作を実行してください。

sed 's/\( *[0-9]*,[^,]*,\).*\(certain phrase[^ ]*\).*/\1\2/;t
  s/\( *[0-9]*,[^,]*,\).*/\1NULL/' file.txt

sed1行ずつ処理が完了し、各行でスクリプトは以下を使用して置換を実行しますs

最初の部分は[0-9]*,[^,]*,日付文字列と一致する必要があります。周囲\(\)に囲まれて\1

\(\)フレーズとスペース以外の末尾(必要に応じて調整)を含む2番目の項目にも同様に適用されます\2。他のすべては捨てられました。

この交換が完了すると、tコマンドは私たちが行ったようにスクリプトの最後に移動します。交換ができない場合、その日以降のすべての製品は交換されます。NONE

答え4

perl -lne 'print /^((?:.+?,){2})/, /\h\K(certain\h+phrase\d+)/ ? $1 : "NULL"' < test.txt

ここでは、カンマで区切られた最初の2つのフィールドを取得し、「特定のフレーズ」を探します。見つかった場合はそれを使用し、そうでない場合は「NULL」を使用してください。

関連情報