#linux #unix
#linux #unix
Вопрос:
В Unix я пытаюсь написать последовательность команд вырезания и вставки (сохранение результата каждой команды в файле), которая инвертирует каждое имя в списке файлов (ниже) и ставит запятую после фамилии (например, Билл Джонсон становится Джонсоном, биллом).).
вот мой список файлов:
2233:charles harris :g.m. :sales :12/12/52: 90000
9876:bill johnson :director :production:03/12/50:130000
5678:robert dylan :d.g.m. :marketing :04/19/43: 85000
2365:john woodcock :director :personnel :05/11/47:120000
5423:barry wood :chairman :admin :08/30/56:160000
Я могу вырезать из короткого списка, но не уверен, как вставить его в мой файл filenew в той же командной строке. Вот мой код для вырезания:
cut -d: -f2 shortlist
Результат:
charles harris
bill johnson
robert dylan
john woodcock
barry wood
Теперь я хочу, чтобы это было вставлено в мой файл filenew, и когда я добавляю filenew, результат должен выглядеть следующим образом,
harris, charles
johnson, bill
dylan, robert
woodcock, john
wood, barry
Пожалуйста, проведите меня через это. Спасибо.
Комментарии:
1. Содержит ли файл shortlist такие записи, как
jane x. smith
илиdr elizabeth jones
или любой другой формат имени, кроме двух слов, разделенных пробелом?
Ответ №1:
Вы могли бы сделать это с помощью одного awk:
awk -F: '{split($2,a, / /); if(a[2]) l=a[2] ", "; print l a[1]}' shortlist
Я предполагаю, что если у вас нет второго имени, вы не хотите печатать запятую (и у вас не более 2 слов в имени).
Комментарии:
1. Я нахожу ваше требование использовать только вырезание / вставку необычным. Но с GNU cut, который предоставляет
--output-delimiter
, вы можете обойтись 2 сокращениями. Но это будет иметь конечную запятую / пробел.cut -d: -f2 --output-delimiter="," shortlist | cut -d' ' --output-delimiter=", " -f2,1
2. Обратите внимание, что GNU
cut
(в соответствии сcut
требованиями POSIX) не повторяет и не переупорядочивает поля. Вы можете запросить данное поле несколько раз, и оно появится один раз; вы можете попытаться изменить порядок полей с-f 2,1
помощью, но поля будут выводиться в порядкеfield1 field2
. Это застало меня врасплох, когда я проверял свой собственный ответ. (У меня есть старая реализацияcut
, которая ведет себя не так; учитывая-f 2,1,2,1
, что она будет выводитьсяharris charles harris charles
).
Ответ №2:
После того, как вы привыкли cut
разделять строку, ее может быть проще использовать awk
, чем paste
выдавать желаемый результат:
$ cut -d":" -f2 shortlist | awk '{printf "%s, %sn", $2, $1}'
Комментарии:
1. Мои команды должны использовать только вырезание и вставку. Я не могу использовать awk с cut. Я смог получить результат с помощью awk, но мне нужно получить его с помощью paste