Насколько я знаю, не существует такого понятия, как домашний каталог -группы. Когда вы выполняете cd ~
, вы переходите в домашний каталог пользователя, который обычно устанавливается в /etc/passwd
и не зависит от вашей группы.
Если вы хотите изменить свой дом, просто:
newgrp - mygroup2
HOME=/home/mygroup2/user
cd ~ # Will move you to $HOME
с использованием Миллера (https://github.com/johnkerl/miller), начиная с
s_id,s_name,s_dob,s_class,s_marks,s_parentname,
1,abc,1/1/18,5,49,def,
2,xyz,1/1/17,4,85,abc,
3,pqr,1/2/18,2,78,mnp,
и работает
mlr --nidx --fs "," filter -S '$2=="abc"' then cut -f 3 input.txt >output.txt
у вас будет
1/1/18
grep abc student.csv | cut -d, -f 3 >text.txt
Это сначала извлечет каждую строку из student.csv
, содержащую подстроку abc
в любом месте, а затем вырежет третий столбец с разделителями-запятыми -из этих строк и сохранит их в text.txt
.
С данными, указанными в вопросе, text.txt
в конечном итоге будет содержать
1/1/18
1/1/17
Это зависит от того, что исходный файл представляет собой простой CSV-файл, т. е. без полей, содержащих встроенные запятые или символы новой строки.
Хотите ли вы искать abc
как полное слово , тогда используйте grep -w abc
вместо просто grep abc
. Это позволит избежать сопоставления строк, содержащих такие строки, как abcde
, но все равно будет соответствовать полю, содержащему abc xyz
.
Если вы ищете поля, которые содержат произвольную сложную строку (все еще в простом файле CSV )и если вам нужно, чтобы поле было точно равно этой строке, вам придется перебирать поля в каждой строке:
string='some string' awk -F, '{ for (i = 1; i <= NF; ++i) if ($i == ENVIRON["string"]) { print $3 ; next } }' student.csv
Этот awk
код перебирает все поля в каждой строке в поисках поля, -разделенного запятыми, значение которого точно совпадает со значением переменной окружения string
. Как только такое поле найдено, печатается 3-е поле.
Учитывая, что вам нужны полные совпадения полей:
$ awk -F, 'FNR==1{print FILENAME} /(^|,)abc(,|$)/{print $3}' file
file
1/1/18
1/1/17
или если abc
может фактически содержать метасимволы RE, которые вы хотите обрабатывать буквально, и поэтому вам нужно выполнить сопоставление строки, а не регулярного выражения:
$ awk -F, 'FNR==1{print FILENAME} index(","$0",",",abc,"){print $3}' file
file
1/1/18
1/1/17
или для печати заголовка столбца:
$ awk -F, 'FNR==1{print $3} /(^|,)abc(,|$)/{print $3}' file
s_dob
1/1/18
1/1/17
$ awk -F, 'FNR==1{print $3} index(","$0",",",abc,"){print $3}' file
s_dob
1/1/18
1/1/17