Далее больше это может даже иметь регулярные выражения. Правильно сформированное расширение фигурной скобки должно содержать закрывшее кавычки открытие и закрывающие фигурные скобки, и по крайней мере одну неупомянутую запятую или допустимое выражение последовательности. Любое неправильно сформированное расширение фигурной скобки оставлено без изменений. Пример:
mkdir /usr/local/src/bash/{old,new,dist,bugs}
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
http://www.gnu.org/s/bash/manual/html_node/Brace-Expansion.html
+1 все, для их поддержки :). Я нашел ровное простое решение:-
[root@localhost base_filters]# paste -d, <(cut -d\| -f2 shortlist| cut -d' ' -f2) <(cut -d\| -f2 shortlist| cut -d' ' -f1)
harris,charles
johnson,bill
dylan,robert
woodcock,john
wood,barry
Это сделано легко с помощью awk
. Сначала распечатайте имя, затем передайте вывод по каналу к awk снова (на этот раз, использовав пространство как разделитель файлов).
awk -F "|" '{print $2}' extract.txt | awk -F " " '{print $2 "," $1}'
В странице справочника сокращения говорится
Выбранный вход записан в том же порядке, что он читается и записан точно однажды.
Таким образом, необходимо использовать другой инструмент вместо сокращения. Например, sed, awk, жемчуг, Python или удар.
Следующая функция будет использовать только созданный-ins Bash (в случае, если это, Вы хотите использовать Bash), чтобы сделать то, что Вы хотите:
foo ()
{
local filename="$1"
while IFS='|' read -r pre name suf; do
l="$pre|${name#* },${name% *}|$suf";
printf '%s\n' "$l";
done < "$filename"
}
Переменная IFS установлена на |, и 'читайте', читает каждую строку за один раз из "1$" (Ваш файл) и делит его на три части, $pre$name и $suf, согласно значению IFS.
Значение $pre установлено, чтобы быть полем, прежде чем имя, $name будет установлен быть самим именем, которое Вы хотите подкачать (второе поле), и $suf является остальной частью строки.
Я использую Расширение Параметра (также поиск Расширения Параметра в man bash
) разделять поле $name.
"${name#* }"
сократит имя, оставляя нас с фамилией.
"${name% *}"
сократит фамилию, оставляя нас с именем.
Использование: нечто [/path/to/file.txt]
Демонстрационный вывод:
nylon100@~$ cat>file.txt
123|first1 last1|foo|bar|date|baz
456|first2 last2|foo|bar|date|baz
789|first3 last3|foo|bar|date|baz
nylon100@~$ foo file.txt
123|last1,first1|foo|bar|date|baz
456|last2,first2|foo|bar|date|baz
789|last3,first3|foo|bar|date|baz
Да, сокращение не изменяет порядок, оно просто выбирает данные из каждой строки.
Необходимо было бы использовать sed
или awk
как:
sed 's/^\([^|]*|\)\([^|]\{1,\}\) \([^ |]\{1,\}\)/\1\3,\2/'
Попытка:
tr -s ' ' < shortlist | cut -d\| -f2 | tr '\n' ' ' | tac -s' ' | \
sed -e 's/^[[:space:]]//' -e 's/ /\n/g' | sort
Или, если у Вас есть много таких файлов:
sortnames () {
tr -s ' ' < $1 | cut -d\| -f2 | tr '\n' ' ' | tac -s' ' | \
sed -e 's/^[[:space:]]//' -e 's/ /\n/g' | sort
}