Bash

從這個不統一的數據集中提取電影名稱的策略?

  • July 6, 2014

我正在研究電影數據庫問題以改進正則表達式,這是我遇到的問題。我的數據集如下所示:

電影名稱(可變空格和製表符)年份

Movie1(它們之間可以有空格或多個空格)(可變空格和製表符可以是 \t+ 或多個空格或單個空格> Year1

Movie2(它們之間可以有空格或多個空格)(可變空格和製表符可以是 \t+ 或多個空格或單個空格> Year2

Movie3(它們之間可以有空格或多個空格)(可變空格和製表符可以是 \t+ 或多個空格或單個空格> Year3

Movie4(可以有空格或多個空格)它們之間的空格)(可變空格和製表符可以是 \t+ 或多個空格或單個空格> Year4

我想提取所有電影的名稱。這些是我在做這件事時面臨的挑戰:

1:分隔符可變。如果它是冒號或獨特的東西,我會使用 awk 命令來提取它們,就像這樣 awk -F ‘separator’ ‘{print $1}’
在這種情況下,它可以是單個空格、兩個或多個空格或 \ 的組合t 或空格。

2:對於分隔符為 \t 的那些行,我可以使用 \t 來提取它,因為這不會出現在電影名稱中。但是如果分隔符是一個空格或兩個空格怎麼辦。它們可以很容易地出現在電影的名稱中。在這些情況下,我不知道該怎麼辦。

我知道這個問題非常嚴格和具體。但正如我之前所描述的,我在這裡非常受阻。我想不出任何辦法來解決這個問題。

是否有任何 grep/sed/awk 與 reg-ex 的組合可用於實現目標?

使用gawk並假設年份總是結束記錄:

awk -F"[0-9]{4}$" '{print $1}' movies

重擊:

while read -r line; do
   if [[ $line =~ (.*)[[:blank:]]+[0-9]{4}$ ]]; then
       echo "${BASH_REMATCH[1]}"
   fi
done < data

但:

sed 's/[[:blank:]]\+[0-9]\{4\}$//' < data

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