получить хэш md5 последнего столбца, в котором есть пробелы из входного текстового файла с 7 миллионами строк - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть файл с 7+ миллионами строк, например:

37831471       48 -rw-r-----    1 user            group               18212 Dec 12 16:24 path/to/file with spaces and backslashes/folder\scn.workflow/documents.wflow
37831472       16 -rw-r-----    1 user            group                 927 Dec 12 16:24 path/to/file with spaces and backslashes/folder\scn.workflow/Info.wflow
37831470       16 -rw-r-----    1 user            group                 136 Dec 12 16:24 path/to/file with spaces and backslashes/folder\scn.workflow/version.wflow

Мне нужно получить 7-й и 11-й столбцы и MD5-хэш строки 11-го столбца (не файл).В 11-м столбцах есть пробелы, поэтому я не могу просто ссылаться на них по определенному полю, поэтому мне нужно очистить определенные столбцы и напечатать всю строку.Мне нужно разделить вкладки, поэтому я должен добавить вкладки ..

Это то, что у меня есть, и вывод, который он дает:

cat -n test.txt | awk '{$2=$3=$4=$5=$6=$7=$9=$10=$11=""; $1=$1"\t"; $8=$8"\t"; print}' 

И вывод:

1              18212        path/to/file with spaces and backslashes/folder\scn.workflow/documents.wflow
2              927          path/to/file with spaces and backslashes/folder\scn.workflow/Info.wflow
3              136          path/to/file with spaces and backslashes/folder\scn.workflow/version.wflow

Единственное, что я не могу понять, это как получить MD5-хэш этого 11-го / последнего столбца.И мне нужен MD5-хэш строки в 11-м / последнем столбце, а не файл, на который он ссылается.

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

1 Ответ

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

Вот как на самом деле делать то, что вы пытаетесь сделать до сих пор, чтобы сохранить пробелы в последней строке (я использовал переменные с именами foo и bar, так как вы не сказали нам, что это за строки, измените эти имена в соответствии с):

$ awk -v OFS='\t' '{foo=$7; sub(/([^[:space:]]+[[:space:]]+){10}/,""); bar=$0; print NR, foo, bar}' file
1       18212   path/to/file with spaces and backslashes/folder\scn.workflow/documents.wflow
2       927     path/to/file with spaces and backslashes/folder\scn.workflow/Info.wflow
3       136     path/to/file with spaces and backslashes/folder\scn.workflow/version.wflow

Для вызова некоторой команды на "bar" (я использую echo ниже) может быть:

awk -v OFS='\t' '{
    foo = $7
    sub(/([^[:space:]]+[[:space:]]+){10}/,"")
    bar = $0
    cmd = "echo \047" bar "\047"
    md5 = ( ((cmd | getline line) > 0) ? line : "N/A" )
    close(cmd)
    print NR, foo, bar, md5
}' file
1       18212   path/to/file with spaces and backslashes/folder\scn.workflow/documents.wflow    path/to/file with spaces and backslashes/folder\scn.workflow/documents.wflow
2       927     path/to/file with spaces and backslashes/folder\scn.workflow/Info.wflow path/to/file with spaces and backslashes/folder\scn.workflow/Info.wflow
3       136     path/to/file with spaces and backslashes/folder\scn.workflow/version.wflow      path/to/file with spaces and backslashes/folder\scn.workflow/version.wflow

, но все зависит от того, как работает ваша команда (например, принимает ли он ввод в качестве аргумента, или из файла, переданного в качестве аргумента, или из канала, или чего-то еще, и обрабатывает ли он по 1 строке за раз, или весь ввод сразу, или что-то еще) и можетболее эффективные способы получить тот же результат в зависимости от этого.

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