この一様でないデータセットから映画のタイトルを抽出するための戦略は何ですか?

この一様でないデータセットから映画のタイトルを抽出するための戦略は何ですか?

正規表現を改善するために映画データベースの問題を研究していますが、これが私が経験している問題です。私のデータセットは次のとおりです。

映画名(可変スペースとタブ)の年
映画1(それらの間にスペースがある場合もあれば、複数のスペースがある場合もあります)(可変スペースとタブは\ t +または複数のスペースまたは単一のスペースにすることができます。>初年度
映画2(それらの間にスペースがある場合もあれば、複数のスペースがある場合もあります)(可変スペースとタブは\ t +または複数のスペースまたは単一のスペースにすることができます。>第二年
映画3(それらの間にスペースがある場合もあれば、複数のスペースがある場合もあります)(可変スペースとタブは\ t +または複数のスペースまたは単一のスペースにすることができます。>3年目
映画4(それらの間にスペースがある場合もあれば、複数のスペースがある場合もあります)(可変スペースとタブは\ t +または複数のスペースまたは単一のスペースにすることができます。>4年生

すべての映画の名前を抽出したいです。私がこのことをしながら経験した困難は次のとおりです。

1: 区切り記号は可変です。コロンまたはユニークな場合は、awkコマンドを使用して次のように抽出します。awk -F 'separator' '{print $1}'
この場合、単一のスペース、複数のスペース、または\ tの組み合わせにすることができます。または空白。

2:区切り文字が\ tの行の場合、映画名には含まれていないため、\ tを使用して抽出できます。ところで、区切り文字が空白1つか空白2つであればどうなりますか?映画のタイトルに簡単に表示できます。このような状況では、どうすればいいかわかりません。

私はこの質問が非常に厳格で具体的であることを知っています。しかし、前述したように、ここではかなり困惑しています。この問題を解決する方法は思い出されません。

目標を達成するために使用できるgrep / sed / awkとreg-exの組み合わせはありますか?

答え1

gawk年が常にレコードで終わると仮定して使用してください。

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

答え2

大きな打撃:

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

sed:

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

答え3

本当に簡単です。最後のフィールド(年)にスペースが含まれていない限り(あなたの質問では明確ではありませんが、これが真であると仮定します)、最後のフィールドを削除するだけです。たとえば、

$ cat movies
Casablanca  1942
Eternal Sunshine        of the Spotless Mind            2004
He Died with a Felafel in His Hand                       2001
The Blues Brothers 1980

したがって、ヘッダーのみを印刷するには、次のものを使用できます。

$ perl -lpe 's/[^\s]+$//' movies
Casablanca  
Eternal Sunshine        of the Spotless Mind            
He Died with a Felafel in His Hand                       
The Blues Brothers 

$ sed 's/[^ \t]*$//' movies 
Casablanca  
Eternal Sunshine        of the Spotless Mind            
He Died with a Felafel in His Hand                       
The Blues Brothers 

またはヘッダーのスペースも縮小します。

$ sed -r 's/[\t ]+/ /g;s/[^ \t]*$//' movies 
Casablanca 
Eternal Sunshine of the Spotless Mind 
He Died with a Felafel in His Hand 
The Blues Brothers 

$ perl -lpe 's/\s+/ /g;s/[^\s]+$//' movies
Casablanca 
Eternal Sunshine of the Spotless Mind 
He Died with a Felafel in His Hand 
The Blues Brothers 

$ awk '{for(i=1;i<NF-1;i++){printf "%s ",$i} print $(NF-1)}' movies
Casablanca 
Eternal Sunshine of the Spotless Mind 
He Died with a Felafel in His Hand 
The Blues Brothers 

年が常に4桁の場合は、次のものを使用できます。

$ perl -lpe 's/....$//' movies 
Casablanca 
Eternal Sunshine of the Spotless Mind 
He Died with a Felafel in His Hand 
The Blues Brothers 

または

$ perl -lpe 's/\s+/ /g;s/....$//' movies 
Casablanca 
Eternal Sunshine of the Spotless Mind 
He Died with a Felafel in His Hand 
The Blues Brothers 

または

$ while read line; do echo ${line%%????}; done < movies|od -c 
Casablanca 
Eternal Sunshine of the Spotless Mind 
He Died with a Felafel in His Hand 
The Blues Brothers 

答え4

これにより、最後の数字とその前のタブとスペースが削除されます。

sed -e 's#[\t ]*[0-9]*$##' movies.txt

関連情報