awk отдельное поле в зависимости от длины - PullRequest
0 голосов
/ 27 июня 2018

У меня есть поле, содержащее строки, похожие на:

HEJ;DU;NORDEN;13322;90
ER;HER;NOGEN;334333;1

Я хочу вывести файл, в котором $ 4 (который может быть 5 или 6 цифрами) разделен на два отдельных поля, в зависимости от длины если 5, разделение должно быть 3-2, если 6 разделение должно быть 3-3

Таким образом, вывод должен быть

HEJ;FRA;NORDEN;133;22;90
ER;HER;NOGEN;334;333;1

У кого-нибудь есть хорошее предложение о том, как сделать это разделение?

Я играю с awk и gsub, и это работает, если я делаю это только для поля, но тогда проблема в том, чтобы вернуть его в соответствие с другими полями, и мне не удалось понять, как я можно встроить функцию gsub в выражение, где она касается только одного столбца данных?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Вы можете использовать функцию substr.

first = substr($4,1,3)
second = substr($4,4)
$4 = $first ";" $second

Вы не нуждаетесь в условных выражениях, поскольку первая часть всегда состоит из 3 цифр.

0 голосов
/ 27 июня 2018

РЕДАКТИРОВАТЬ: Более простой подход.

awk -F";" '{sub(/^.../,"&" OFS,$4)} 1' OFS=";"  Input_file

Не проверяя условия, такие как длина столбца 5 или 6, если вы захотите это сделать, мы могли бы добавить их и в приведенный выше код.


Не могли бы вы попробовать и сообщите мне, поможет ли это вам.

awk -F";" -v s1=";" '
{
  $4=length($4)==5?substr($4,1,3) s1 substr($4,4):length($4)==6?substr($4,1,4) s1 substr($4,5):$4
}
1' OFS=";"  Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...