команда сокращения, порядок, не сохраненный?

Далее больше это может даже иметь регулярные выражения. Правильно сформированное расширение фигурной скобки должно содержать закрывшее кавычки открытие и закрывающие фигурные скобки, и по крайней мере одну неупомянутую запятую или допустимое выражение последовательности. Любое неправильно сформированное расширение фигурной скобки оставлено без изменений. Пример:

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

http://www.linuxjournal.com/content/bash-brace-expansion

4
16.04.2013, 16:03
6 ответов

+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
0
27.01.2020, 20:46

Это сделано легко с помощью awk. Сначала распечатайте имя, затем передайте вывод по каналу к awk снова (на этот раз, использовав пространство как разделитель файлов).

awk -F "|" '{print $2}' extract.txt | awk -F " " '{print $2 "," $1}'
4
27.01.2020, 20:46

В странице справочника сокращения говорится

Выбранный вход записан в том же порядке, что он читается и записан точно однажды.

Таким образом, необходимо использовать другой инструмент вместо сокращения. Например, sed, awk, жемчуг, Python или удар.

4
27.01.2020, 20:46

Следующая функция будет использовать только созданный-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
4
27.01.2020, 20:46

Да, сокращение не изменяет порядок, оно просто выбирает данные из каждой строки.

Необходимо было бы использовать sed или awk как:

sed 's/^\([^|]*|\)\([^|]\{1,\}\) \([^ |]\{1,\}\)/\1\3,\2/'
3
27.01.2020, 20:46

Попытка:

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
}
1
27.01.2020, 20:46

Теги

Похожие вопросы