поменять местами первые два поля с помощью awk - PullRequest
0 голосов
/ 28 февраля 2012

Я играю с awk и пытаюсь поменять местами первые два поля файла, например:

awk -F : '/cjares/{temp=$1; $1=$2; $2=temp; print}' /etc/passwd

Однако вывод не верный. Это два выхода: один без замены полей, второй после замены полей:

x cjares 3158 115 Caleb Timothy Jares,256 Avery Hall,2-7763 /home/ugrad/cjares /bin/tcsh
cjares:x:3158:115:Caleb Timothy Jares,256 Avery Hall,2-7763:/home/ugrad/cjares:/bin/tcsh

Он заменяет все точки с запятой пробелами.

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

В awk разделителем выходных полей по умолчанию (OFS) является пробел "". Вы можете изменить это:

awk -F: 'BEGIN{OFS=":"} /cjares/{temp=$1; $1=$2; $2=temp; print}' /etc/passwd
0 голосов
/ 28 февраля 2012

К сожалению, вы не собираетесь магически изменять значение $ 0, переназначая $ 1 и $ 2. Вы должны точно указать awk, что именно вы хотите напечатать здесь.

Это означает, что вам нужно явно перегенерировать строку с

print $ 2, ":", $ 1, ":", $ 3, ":" ...

или используйте printf аналогичным образом.

sed может быть чуть лучше - вы можете просто поменять местами первые два поля, используя замену регулярного выражения. В качестве альтернативы вы можете сделать то же самое в awk, используя функции sub или gsub, но это, вероятно, более болезненно.

Кстати, вам, вероятно, нужен пробел между / cjares / и действием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...