シェルの区切り記号に基づくデータのフィルタリング

シェルの区切り記号に基づくデータのフィルタリング

次のデータを含むファイルがあります。

"google1|yoo|dummy|yes|wow|/" + VARIABLE + "/"
"google2|hub|lab|dummy|yes|/" + VARIABLE + "/"
"google3|short|lab|yoo|/" + VARIABLE + "/"
"google4|hello|good-guy|bad-girl|lol|dummy|/" + VARIABLE + "/"
"google5|good-guy|a4-123|yoo|/" + VARIABLE + "/"
"google6|bad-girl|b4-124|hub|/" + VARIABLE + "/"

今、区切り記号 "|"間の文字列(パイプライン)のリストを取得したいです。

出力は

yoo
dummy
yes
wow
hub
hello
good-guy
bad-girl
a4-123
b4-124
dummy
lol
short
lab

デフォルトでは、区切りフィルタの後に文字列リストから一意の値を取得したいと思います。私はawkを次のように使ってみました。

awk -F"|" '{gsub(/\).*/,"",$2);print $2}' file

しかし、間違ったデータを受け取っています。

ベストアンサー1

grepオプションがある場合pcre

$ grep -oP '\|\K[^|]+(?=\|)' ip.txt | sort -u
a4-123
b4-124
bad-girl
dummy
good-guy
hello
hub
lab
lol
short
wow
yes
yoo
  • -o一致するパターンのみを印刷
  • -PPCRE正規表現の使用
  • \|\K|抽出したい文字列の前に文字列があるかどうかを検索して確認します。
    • 同様に、抽出する文字列の後に次のものがあるかどうかを(?=\|)事前に確認してください。|
  • [^|]+抽出する文字列 -|その文字を1つ以上反転して取得します。
  • sort -u独自の価値を得る

これらの文字列の検索順序を維持するには、次のようにします。

$ grep -oP '\|\K[^|]+(?=\|)' ip.txt | awk '!seen[$0]++'
yoo
dummy
yes
wow
hub
lab
short
hello
good-guy
bad-girl
lol
a4-123
b4-124

おすすめ記事