给出来自 hashdeep 的输出文件的以下组成片段:
7241,11111111111111111111111111111111,\01-data\file1
1237241,22222222222222222222222222222222,\01-data\file2
41,33333333333333333333333333333333,\01-data\file3
我该如何将其格式化为:
7241,11111111111111111111111111111111,\01-data\file1
1237241,22222222222222222222222222222222,\01-data\file2
41,33333333333333333333333333333333,\01-data\file3
我想使用 sed (因为这就是我开始掌握的),但是有没有办法告诉 sed 仅更改出现在特定列中的字符?
当然,如果有其他方法可以做到这一点,我也会很高兴听到。
这样做的原因是我想对文件名的输出进行排序,以便我可以比较两个输出文件,而不必-j0
在 hashdeep 上使用(单线程)选项。
答案1
和awk
:
awk -v l="$(wc -L <file)" '{printf "%"l"s\n", $0}' file
-v
将外部值赋给awk
变量l
。wc -L <file
找到文件中最长行的长度。
printf "%"l"s\n", $0
打印每行并用空格填充l
。对于 10 个空格,它看起来像:printf "%10s\n", $0
。
输出:
7241,11111111111111111111111111111111,\01-data\file1
1237241,22222222222222222222222222222222,\01-data\file2
41,33333333333333333333333333333333,\01-data\file3
答案2
sed -e:, -e's/^[^,]\{0,6\},/ &/;t,'
它只是执行一个小循环,直到行首至少有 7 个非逗号为止。不过,如果已经有少于 7 个紧随其后的逗号的非逗号,那么它只会执行任何操作。因此,它不会影响空白行或与逗号不匹配的行,或者那些与逗号匹配但已经以 7 个或更多非逗号开头的行。
该循环也非常便宜 - 自动机只需要考虑两种字符 - 逗号或非逗号 - 并且在任何给定时间最多只考虑其中的 7 个。
7241,11111111111111111111111111111111,\01-data\file1
1237241,22222222222222222222222222222222,\01-data\file2
41,33333333333333333333333333333333,\01-data\file3
答案3
不使用sed
.我复制了您的输入并粘贴到 Libreofffice Calc 中,在“选择性粘贴”中选择了“用逗号分隔”选项,并将每种数据类型放入单独的列中,如下所示。
我认为非常简单的解决方案。
7241 11111111111111100000000000000000 \01-data\file1
1237241 22222222222222200000000000000000 \01-data\file2
41 33333333333333300000000000000000 \01-data\file3
答案4
我不太明白这个问题,但我想你只是想按文件名排序?在这种情况下,只需使用sort
:
sort -t , -k 3 my_file.txt