Например, допустим у меня есть файл "спортсмены" со строками

1995-05-30-John-Smith 
1992-John-30-Smith-10 

Как я мог перечислить первые 2 слова строк, оканчивающихся на «Смит», и последнее, одновременно изменив формат на #:

Таким образом, результат будет:

1995#05#Smith
0
Prvt_Yadav 1 Ноя 2019 в 19:26
Если вам действительно нужны «строки, которые заканчиваются на Smith», убедитесь, что у вас нет пробелов в конце.
 – 
glenn jackman
4 Ноя 2019 в 19:32

3 ответа

Вы можете использовать awk как:

awk -F'-' '/Smith$/{print $1"#"$2"#"$NF}' athletes

Это даст результат:

1995#05#Smith

Здесь awk будет искать строки, оканчивающиеся на Smith, и будет печатать первое, второе и последнее поле с # между ними.

Использование sed

sed -En 's/([^-]*)-([^-]*).*Smith$/\1#\2#Smith/gp' file.txt

Он будет совпадать до тех пор, пока не появятся первые два -, а затем будут напечатаны только совпадающие строки после их изменения.

1
Prvt_Yadav 1 Ноя 2019 в 19:49
Если я хочу сделать еще одно слово, например, оканчивающееся на «Смит» или «Уильям», можно ли сделать это всего одной командой?
 – 
MADS
1 Ноя 2019 в 20:25
Вы можете использовать простое или условие, т. е. использовать /Smith$/ || /William$/ вместо /Smith$/. Скажи мне после использования этого.
 – 
Prvt_Yadav
2 Ноя 2019 в 13:15

Вы можете попробовать это:

grep "Smith$" file | tr "-" "#" | cut -d'#' -f1,2,5

Выход:

1995#05#Smith
0
schrodigerscatcuriosity 1 Ноя 2019 в 19:33

Мы также можем сделать это ниже с помощью простой команды

 awk -F "-" '/Smith$/&&OFS="#"{print $1,$2,$NF}' file

Выход

1995#05#Smith
0
Praveen Kumar BS 3 Ноя 2019 в 12:45
Почему вы выполняете присваивание переменной как часть условия? Я бы определил OFS как аргумент командной строки с переключателем -v.
 – 
glenn jackman
4 Ноя 2019 в 19:31