Ubuntu

根據shell中的分隔符過濾數據

  • October 13, 2016

我有一個包含如下數據的文件:

"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

但是,我得到錯誤的數據。

如果您有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只列印匹配的模式

  • -P使用 pcre 正則表達式

  • \|\K積極向後看是否|在我們要提取的字元串之前存在

    • 同樣,(?=\|)積極的前瞻看看|我們的字元串之後是否有被提取
  • [^|]+要提取的字元串 - 簡單地取反|並獲取一個或多個這樣的字元

  • 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

引用自:https://unix.stackexchange.com/questions/313430