私は長いドキュメント(この長いファイルにはそれぞれ日付/時刻で始まるいくつかの段落が含まれています)を「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
grep
pingを実行する代わりに、while
1つのスクリプトsed
ですべての操作を実行してください。
sed 's/\( *[0-9]*,[^,]*,\).*\(certain phrase[^ ]*\).*/\1\2/;t
s/\( *[0-9]*,[^,]*,\).*/\1NULL/' file.txt
sed
1行ずつ処理が完了し、各行でスクリプトは以下を使用して置換を実行します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」を使用してください。