Отделите элемент после каждого второго ',' и вставьте в следующую строку в bash [дубликат]

Con el comando visudoeditaste el archivo /etc/sudoers, que solo aplica si antepones tus comandos con sudo, en tu caso sudo service nginx start.

5
18.05.2019, 17:32
8 ответов

Использование цикла Sed:

sed -e 's/,/\n/2' -e 'P;D' file

Пр.

$ echo '201012,720,201011,119,201710,16' | sed -e 's/,/\n/2' -e 'P;D'
201012,720
201011,119
201710,16

Это заменяет второе ,на \n, затем печатает и удаляет \nдо тех пор, пока замена больше не будет успешной.

BSD не понимает новую строку как \nв правой части команд s, это обходной путь для оболочек ksh, bash, zsh:

sed -e :a -e $'s/,/\\\n/2' -e 'P;D' file

Или общее решение для (старых )seds:

sed '
:a
s/,/\
/2
P;D
' file
5
27.01.2020, 20:32
$ paste -d, - - < <( tr ',' '\n' <file )
201012,720
201011,119
201710,16

или, без замены процесса,

$ tr ',' '\n' <file | paste -d, - -
201012,720
201011,119
201710,16

Это заменяет все запятые в файле новыми строками, используя tr, затем использует pasteдля создания двух столбцов, разделенных запятой.

Если trкажется слишком простым, вы можете заменить его на sed 'y/,/\n/', который делает то же самое.

5
27.01.2020, 20:32

Мне удалось сделать это с помощью следующей команды awk:

awk -F, -v OFS=, '{for (i=1;i<=NF;i=i+2) {j=i+1; print $i,$j}}' input

Это будет перебирать каждый столбец во входных данных (, увеличивая на 2 каждую итерацию )и печатать этот столбец плюс следующий соседний столбец в строке перед переходом к следующему.

$ cat input
201012,720,201011,119,201710,16
$ awk -F, -v OFS=, '{for (i=1;i<=NF;i=i+2) {j=i+1; print $i,$j}}' input
201012,720
201011,119
201710,16
4
27.01.2020, 20:32
awk -F'\n' -vRS=, '{l=$1; $0=""; getline; print l RS $1}'

или

awk -F'\n' -vRS=, '{print $1 RS (getline > 0 ? $1 : "")}'

Вы можете опустить -F'\n', если поля не содержат пробелов. Или установите его на то же значение, что и разделитель записей (, например. с -F,), если ваши поля могут также содержать новые строки (, если, например. в выводе echo 1,2,3,4последнее поле должно быть 4\n, а не4).

0
27.01.2020, 20:32

Использование xargsиprintf:

xargs -d, printf '%s,%s\n' < file

Выход:

201012,720
201011,119
201710,16

Приведенный выше код предполагает, что каждая строка содержит четное количество полей. Если нет, xargsнапечатает одиночные числа и оборванные запятые. Но этот несколько более медленный код должен справиться почти со всем :

.
tr, '\n' < file | xargs -n2 printf '%s,%s\n' | sed '$s/,$//'

Который можно ускорить, увеличив -n2до некоторого разумного максимального четного числа, например. предположим, что ни одно число во входных данных не длиннее 15 цифр:

m=$(getconf ARG_MAX) m=$(( (m/16) + (m%2) ))
tr, '\n' < file | xargs -n"${m}" printf '%s,%s\n' | sed '$s/,$//'
1
27.01.2020, 20:32

На основе оболочки:

(set -f; IFS=','; printf '%s,%s\n' $(< file))

измените на $(cat file), если не используете ksh,bash,zsh (т.е. :тире и др. ).

Ограничено памятью (или другими ограничениями ресурсов, используемых для экземпляра оболочки, используемого )в оболочках, которые реализуют printfкак встроенные(большинство оболочек ). Или по значению ARG _MAX в оболочках (, т.е. ksh88 ), которые вызывают execveдля выполнения командной строки.

0
27.01.2020, 20:32

Другое sedрешение:

sed 's/\([^,]*,[^,]*\),/\1\n/g' file

Это заменяет каждую вторую запятую новой строкой.

1
27.01.2020, 20:32

Вы можете использоватьgrep-имейте в виду, что не все версии поддерживают -oи что это не будет работать для нечетного числа полей

grep -E -o '[^,]+,[^,]+' file

Или перебор

gawk 'BEGIN{FPAT="[^,]+,[^,]+";OFS="\n"}; {$1=$1; print}' file
1
27.01.2020, 20:32

Теги

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