grepからsedに切り替える

grepからsedに切り替える

students.txt次の形式の行を含むファイルがあります。

Surname, Forename: Day.Month.Year: Degree

たとえば、

Smith, John: 15.01.1986: MSc IT
Taylor, Susan: 04.05.1987: MSc IT
Thomas, Steve: 19.04.1986: MSc MIT
Sellen, Jo: 03.07.1987: MSc CSE

以下の命令をsed1987年に生まれた生徒のすべての姓を返す命令に変更するにはどうすればよいですか。

$ grep 1987 students.txt | grep -o "^\(.*\),"

答え1

sed -n '/1987/s/^\([^,]*\),.*$/\1/p' students.txt

またはGlennが指摘したように:

sed -n '/1987/s/,.*//p' students.txt

答え2

awkを使用したい場合は、Johnsywebに対する他の答えを提案します。 awkの強力な機能には、フィールド区切り文字の選択が含まれます。

awk -F'[,: ]*' '$3 ~ /1987$/ {print $1}' students.txt

しかし、問題はsedに関するものなので、SiegeXがより良い投票を受ける資格があると思います。

答え3

このタイプの質問は、次の場合に適していますawk

% awk '/\.1987:/ {gsub(/,.*/, ""); print}' students.txt 
Taylor
Sellen

または、行全体ではなく列を指定します。これにより、次の場所に追加の列を追加したい場合は、簡単にカスタマイズできます。

% awk '/\.1987:/ {
        gsub(/,$/, "", $1);          
        print $1;
}' students.txt
Taylor
Sellen

関連情報