Как переупорядочить элементы каждой строки в файле, используя sed и / или awk, следуя динамическому формату - PullRequest
0 голосов
/ 05 октября 2018

В настоящее время у меня есть файл с каждой строкой, содержащей упорядоченные данные.Например:

Peter:Connor:14:40kg
George:Head:56:60kg

У меня есть функция листинга, которая принимает в качестве аргумента строку «format».Эта строка содержит сокращения, представляющие каждый возможный элемент списка.В этом примере аббревиатуры будут:

%N, %S, %A, %W

Этим аббревиатурам может предшествовать или следовать любое количество символов.

Я хочу напечатать данные так,что он соответствует полученному строковому формату, заменяя каждую аббревиатуру соответствующим элементом в списке.Например, я мог бы получить:

{%A} [%W] %S %N

или

%S|%N|%A[[%W]]

И мне потребуется изменить порядок данных, чтобы они соответствовали требуемому формату.Поскольку это аргумент в функции, у меня нет возможности узнать заранее, что я получу.

{14} [40kg] Connor Peter

и для второго примера

Connor|Peter|14[[40kg]]

Как я могу использовать awk для выполненияэто? * * 1023

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Предполагая, что I might receive... приведет к тому, что вы сможете передать строку с этим значением в awk:

$ cat tst.awk
BEGIN {
    FS = ":"
    tmp = fmt
    sub(/^[^[:alpha:]]+/,"",tmp)
    split(tmp,flds,/[^[:alpha:]]+/)
    gsub(/[[:alpha:]]+/,"%s",fmt)
    fmt = fmt ORS
}
NR==1 {
    for (i=1; i<=NF; i++) {
        f[$i] = i
    }
    next
}
{ printf fmt, $(f[flds[1]]), $(f[flds[2]]), $(f[flds[3]]), $(f[flds[4]]) }

$ awk -v fmt='{age} [kilo] surname name' -f tst.awk file
{14} [40kg] Connor Peter
{56} [60kg] Head George

$ awk -v fmt='surname|name|age[[kilo]]' -f tst.awk file
Connor|Peter|14[[40kg]]
Head|George|56[[60kg]]

Для того, чтобы вышеописанное работало, должно быть что-то, что называет столбцы, которые вы могли быкод, который в скрипте, если хотите, но я добавил его в качестве строки заголовка в CSV вместо:

$ cat file
name:surname:age:kilo
Peter:Connor:14:40kg
George:Head:56:60kg
0 голосов
/ 05 октября 2018
awk 'BEGIN{FS=":"; OFS=" "}{print "{"$3"}","["$4"]",$2,$1}' inputFile

дает:

{14} [40kg] Connor Peter
{56} [60kg] Head George

и

awk 'BEGIN{FS=":"; OFS="|"}{print $2,$1,$3"[["$2"]]"}' inputFile

выход

Connor|Peter|14[[Connor]]
Head|George|56[[Head]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...