Команда awk для создания sha2 отдельного столбца и вставки в новый файл - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть файл с несколькими строками.Используя этот исходный файл, я создаю еще один файл, но в этом новом файле я беру только несколько столбцов исходных файлов.

Что мне нужно сделать, вместо того, чтобы просто выбирать несколько столбцов и вставлять новые файлыМне нужно создать sha2 первого столбца и вставить в новый файл как обычное значение, так и значение sha2.

Надеюсь, что все понятно.

Это команда awk, которую я использую длясделать то же самое.

 awk -F '|' -v  OFS='|' -v  var="10|" '(NR - 1) != 0  {$2=var$2; print $2,$3,$4,$5} (NR - 1) == 0   {print} ' $line > $subName$i$output

ВХОД

2|0001001010000026316|531849|1150|101|01111991|00919323739251      |VIJAYPANDEY1191@GMAIL.COM                                   |VIJAY PANDEY                            |PART OF GROUND FLOOR & BASEMENT         |SHOPPER STOP SV ROAD ANDHERI WEST       |LANDMARK-ERSTWHILE CRASSWORD BOOK STORE |MUMBAI                        |400058

ОЖИДАЕМЫЙ ВЫХОД ТРЕБУЕТ ЗНАЧЕНИЕ SHA2 2-Й КОЛОННЫ И ПРИЛОЖИТ В КАК ПОСЛЕДНУЮ КОЛОННУ В ЖЕROW

10|0001001010000026316|531849|1150|101|2e16abd9f3e3e368210b11faa5bfebdb6e001034b58cc9ad1c689dfd1f7eeacd

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

С GNU awk вы можете обойтись без установки NF, хотя Ed это не понравится:

awk '{ NF=5; "echo " $2" | sha256sum | cut -d\\\  -f1" | getline $(NF+1) } 1' FS='|' OFS='|'

Вы можете сделать то же самое с меньшим количеством проблем переносимости с paste и cut:

paste -d'|' <(cut -d'|' -f1-5 infile) <(cut -d'|' -f2 infile | sha256sum | cut -d' ' -f1)
0 голосов
/ 13 декабря 2018

Попробуйте:

awk -F"|" -v var="10" '
    NR==1;
    NR>1{
        "echo "$2"|sha256sum" | getline shaoutput; 
        split(shaoutput, sha, " "); 
        print var, $2, $3, $4, $5, sha[1]
    }' OFS="|" file

Вывод:

10|0001001010000026316|531849|1150|101|2e16abd9f3e3e368210b11faa5bfebdb6e001034b58cc9ad1c689dfd1f7eeacd

Я предпочитаю использовать NR==1 и NR>1, так как он более читабелен.

NR==1; в порядке, нет необходимости добавлять {print}

Для NR>1 я использую sha256sum для генерации ша, поскольку awk не имеет никакой функции для этого (насколько мне известно).Я сохраняю вывод в переменной shaoutput, очищаю вывод, используя split, затем печатаю то, что нужно.

Я предпочитаю не хранить разделитель вывода внутри переменной var.Использование запятых внутри печати заставит awk использовать переменную OFS в качестве разделителя.

Отредактировано

Как предлагает Эд Мортон, улучшенное решение:

awk -v var="10" '
    BEGIN{
        FS=OFS="|"
    }
    NR==1;
    NR>1{
        shaoutput="";
        cmd="echo \047" $2 "\047 | sha256sum" ;
        if ( (cmd | getline line) > 0 ){
            shaoutput=line
            close(cmd)
        }
        split(shaoutput, sha, " ");
        print var, $2, $3, $4, $5, sha[1];
    }' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...