从具有700万行的输入文本文件中获取最后一列的md5哈希,该哈希具有空格

时间:2018-12-15 16:30:55

标签: bash awk tabs md5

我有一个文件,其中包含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列,以及第11列字符串(不是文件)的MD5哈希。第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

我唯一不知道的事情是如何获取第11 /最后一列的MD5哈希值。而且我需要在第11 /最后一栏中输入字符串的MD5哈希值-而不是其引用的文件。

我希望能够为每列修剪空白,但这不是必需的。

1 个答案:

答案 0 :(得分:2)

这是到目前为止如何真正执行您要尝试执行的操作,以便在最后一个字符串中保留空格(我使用名为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

要在“栏”上调用某些命令(我在下面使用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行,或者一次或所有其他输入),并可能有更有效的方式来获得相同的输出。