Bash
從這個不統一的數據集中提取電影名稱的策略?
我正在研究電影數據庫問題以改進正則表達式,這是我遇到的問題。我的數據集如下所示:
電影名稱(可變空格和製表符)年份
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