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
以下の命令をsed
1987年に生まれた生徒のすべての姓を返す命令に変更するにはどうすればよいですか。
$ 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