我有一个文件,其中包含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哈希值-而不是其引用的文件。
我希望能够为每列修剪空白,但这不是必需的。
答案 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行,或者一次或所有其他输入),并可能有更有效的方式来获得相同的输出。