Как использовать команды вырезания и вставки в виде однострочной команды?

#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