Подтвердить что ты не робот

AWK сначала напечатать поле $2, затем поле $1

Вот вход (образец):

[email protected]|com.emailclient.account
[email protected]|com.socialsite.auth.account

Я пытаюсь добиться этого:

Emailclient [email protected]
Socialsite [email protected]

Если я использую AWK следующим образом:

cat foo | awk 'BEGIN{FS="|"} {print $2 " " $1}'

он испортил вывод, наложив поле 1 в верхнюю часть поля 2.

Любые советы/предложения? Спасибо.

4b9b3361

Ответ 1

Несколько общих советов (помимо проблемы с завершением строки DOS):

cat предназначен для конкатенации файлов, это не единственный инструмент, который может читать файлы! Если команда не читает файлы, используйте перенаправление, например command < file.

Вы можете установить разделитель полей с опцией -F, чтобы вместо:

cat foo | awk 'BEGIN{FS="|"} {print $2 " " $1}' 

Try:

awk -F'|' '{print $2" "$1}' foo 

Это выведет:

com.emailclient.account [email protected]
com.socialsite.auth.accoun [email protected]

Чтобы получить желаемый результат, вы можете делать множество вещей. Я бы, вероятно, split() второе поле:

awk -F'|' '{split($2,a,".");print a[2]" "$1}' file
emailclient [email protected]
socialsite [email protected]

Наконец, чтобы первый символ, преобразованный в верхний регистр, немного болел в awk, поскольку у вас нет хорошей встроенной функции ucfirst():

awk -F'|' '{split($2,a,".");print toupper(substr(a[2],1,1)) substr(a[2],2),$1}' file
Emailclient [email protected]
Socialsite [email protected]

Если вам нужно что-то более сжатое (хотя вы отказываетесь от подпроцесса), вы можете сделать:

awk -F'|' '{split($2,a,".");print a[2]" "$1}' file | sed 's/^./\U&/'
Emailclient [email protected]
Socialsite [email protected]

Ответ 2

В качестве разделителя полей используйте точку или трубу:

awk -v FS='[.|]' '{
    printf "%s%s %s.%s\n", toupper(substr($4,1,1)), substr($4,2), $1, $2
}' << END
[email protected]|com.emailclient.account
[email protected]|com.socialsite.auth.account
END

дает:

Emailclient [email protected]
Socialsite [email protected]

Ответ 3

awk в порядке. Я предполагаю, что файл находится в системе Windows и имеет CR (^ m ascii 0x0d) в конце строки.

Это приведет к тому, что курсор перейдет к началу строки после $2.

Используйте dos2unix или vi с :se ff=unix, чтобы избавиться от CR.

Ответ 4

Может быть, ваш файл содержит терминатор CRLF. За каждой строкой следует \r\n.

awk распознает $2 самом деле $2\r. \r означает начало строки.

{print $2\r$1} сначала напечатает $2, затем вернется к голове, а затем напечатает $1. Таким образом, поле 2 перекрывается полем 1.